POST 请求变量 powershell

POST request variables powershell

我有一个使用 Invoke-WebRequest 的 powershell post 请求,但是当我包含 ?它认为它是一个变量,任何逃避它的方法,这是我的代码

Invoke-WebRequest -UseBasicParsing -Method POST https://192.168.240.1:443/recive/$name?result=$sendback

它认为名称和后面的所有内容都是一个变量,我知道这一点,因为我可以在 windows 终端中看到它全部突出显示为绿色

正如@Abraham Zinala 所暗示的那样,多功能反引号 (`) 是 PowerShell 中的转义字符。您可以通过更改此行中反引号的位置来验证效果

echo https://192.168.240.1:443/recive/$name?result=$sendback

我相信你要找的就是这个

echo https://192.168.240.1:443/recive/$name`?result=$sendback

补充

虽然在第一个 post-variable-name 字符之前使用 `(反引号,PowerShell 的转义字符)始终是一个选项(在不带引号和双引号的参数中),但有一个直接方式在(隐式)expandable strings中划定变量名将名称括在{...},例如${name}:

Write-Output https://192.168.240.1:443/receive/${name}?result=$sendback

虽然 ${name}? 之类的内容比 $name`? 更难打字,但它有两个明显的 优点 :

  • 它更具可读性(视觉上不同)。
  • 它适用于 所有 情况,而 `-转义 post-name 字符可能会意外将该字符变成 escape sequence ;例如,假设变量 $foo 后面应该跟文字 bar
    • Write-Output $foo`bar - 损坏,因为 `b 变成了 退格字符 .
    • Write-Output ${foo}bar - 好的,感谢 {...} 外壳

可选阅读:为什么PowerShell允许在标识符(变量名)中使用?

大多数脚本和编程语言不允许 ? 作为变量名等标识符的一部分,通常是因为 ?metacharacter(具有特殊含义的字符)。

尽管 ? 在 PowerShell 中也有特殊含义,根据上下文,? 在标识符(变量名、函数名、别名...)中 允许。

虽然一方面 PowerShell 允许包含不寻常字符的标识符值得称赞,但对于此类名称需要 {...} 附件 是有意义的[1] - other 不寻常的字符确实已经需要,特别是 .-:

# With ".", {...} is required.
PS> ${foo.bar} = 'bar'; ${foo.bar} # Without {...}, .bar would be a *property access*.
bar

遗憾的是,使用 ? 不需要 {...}:

# !! With "?", {...} is NOT required.
PS> $foo? = 'bar'; $foo?
bar

此行为 主动干扰 PowerShell (Core) v7.1+ null-conditional operators?.?[]

例如,假设我想要空条件访问变量 $var:

的 属性
# FAILS, because "?" is considered part of the variable name.
Set-StrictMode -Version 3; $var = Get-Item foo*.txt; $var?.Length

错误信息是InvalidOperation: The variable '$var?' cannot be retrieved because it has not been set.;也就是说,表达式 $var?.Length 被解释为想要对名为 $var? 的变量执行 常规 属性 访问 (.) - 相反对变量 $var.

的预期空条件访问

{...} 在这种情况下 是必需的 即使名称 $var 本身 不是 [=120] =]包含特殊字符:

# OK, due to {...} - but this shouldn't be necessary
Set-StrictMode -Version 3; $var = Get-Item foo*.txt; ${var}?.Length

鉴于此 既违反直觉又麻烦 GitHub proposal #11379 要求更改此行为。尽管这在技术上是一个 重大的 变化,但分析表明,在 ? 中变量名称 ending 的实际使用非常罕见而且,相反,这种使用通常是 错误的 ,即基于这样的预期,即尾随 ? 不是 的一部分变量名。


[1] 请注意,鉴于只有 变量 名称,而不是函数,...,支持 {...} 封装,这将限制?-包含变量的名称。