我有一个使用 Invoke-WebRequest
的 powershell 发布请求,但是当我包含 ?它认为它的所有变量都是一个变量,任何方法都可以逃避这一点,这是我的代码
Invoke-WebRequest -UseBasicParsing -Method POST https://192.168.240.1:443/recive/$name?result=$sendback
它认为 name 和后面的所有内容都是一个变量,我知道这一点,因为我可以在 windows 终端中看到它全部以绿色突出显示
答案 0 :(得分:4)
补充jswanson's effective solution:
虽然在第一个变量名后字符之前使用 `
(反引号,PowerShell 的转义字符)始终是一个选项(在不带引号和双引号的参数中),但有一个 在(隐式)expandable strings 中描述变量名称的直接方法:将名称括在 {...}
中,例如${name}
:
Write-Output https://192.168.240.1:443/receive/${name}?result=$sendback
虽然像 ${name}?
这样的输入比 $name`?
更麻烦,但它有两个明显的优势:
`
-转义后名称字符可能会意外地将该字符变成escape sequence;例如,说变量 $foo
后面应该跟文字 bar
:
Write-Output $foo`bar
- Broken,因为 `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
本身不包含特殊字符:
# OK, due to {...} - but this shouldn't be necessary
Set-StrictMode -Version 3; $var = Get-Item foo*.txt; ${var}?.Length
鉴于这既违反直觉又麻烦,GitHub proposal #11379 要求改变这种行为。尽管这在技术上是一个破坏变化,但分析表明,在现实世界中使用以?
结尾的变量名是非常罕见的,相反,这样的使用通常是错误的,即基于期望的结尾 ?
不是变量名称的一部分。
[1] 请注意,鉴于只有 变量 名称,而不是函数,...,支持 {...}
外壳,这将限制包含 ?
变量名。
答案 1 :(得分:3)
正如@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