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 终端中全部突出显示为绿色
为了补充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] 请注意,鉴于只有变量名称,而不是函数,...,支持{...}封装,这会将 -?包含名称限制为变量。
| 归档时间: |
|
| 查看次数: |
285 次 |
| 最近记录: |