POST 请求变量 powershell

Jon*_*tti 1 variables powershell escaping string-interpolation invoke-webrequest

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

Invoke-WebRequest -UseBasicParsing -Method POST https://192.168.240.1:443/recive/$name?result=$sendback
Run Code Online (Sandbox Code Playgroud)

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

mkl*_*nt0 5

为了补充jswanson 的有效解决方案

`虽然在第一个后变量名称字符之前放置(反引号,PowerShell 的转义字符)在某些情况下是一个选项[1](在不带引号和双引号的参数中),但有一种直接方法可以在(隐式)可扩展中分隔变量名称strings将名称括在 中{...},例如${name}

Write-Output https://192.168.240.1:443/receive/${name}?result=$sendback
Run Code Online (Sandbox Code Playgroud)

虽然类似的东西${name}?输入起来比 更麻烦$name`?,但它有两个明显的优点

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

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

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

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

虽然一方面值得称赞的是 PowerShell 允许包含不寻常字符的标识符,但要求{...}对此类名称进行封装是有意义的[2] - 因为实际上已经对其他不常见字符进行了要求,特别是.-

# With ".", {...} is required.
PS> ${foo.bar} = 'bar'; ${foo.bar} # Without {...}, .bar would be a *property access*.
bar
Run Code Online (Sandbox Code Playgroud)

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

# !! With "?", {...} is NOT required.
PS> $foo? = 'bar'; $foo?
bar
Run Code Online (Sandbox Code Playgroud)

此行为会主动干扰PowerShell (Core) v7.1+ null 条件运算符?.?[]

例如,假设我想要对变量的属性进行空条件访问$var

# FAILS, because "?" is considered part of the variable name.
Set-StrictMode -Version 3; $var = Get-Item foo*.txt; $var?.Length
Run Code Online (Sandbox Code Playgroud)

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

{...}即使名称本身包含特殊字符,在这种情况下也是必需的$var

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

鉴于这既违反直觉又麻烦GitHub 提案 #11379要求改变这种行为。尽管这在技术上是一个重大变化,但分析表明,在现实世界中使用以 结尾?的变量名是非常罕见的,相反,这种使用经常是错误的,即基于尾随不是变量?的一部分的预期。变量名。


[1] 只有当`与第一个变量名后字符组合不会意外导致转义序列时,这才是一个选项;t例如,就像发生的那样。

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