我有一个使用Invoke-WebRequest
的powershell发布请求,但当我包含?它认为这都是一个变量,任何逃避的方法,这是我的代码
Invoke-WebRequest -UseBasicParsing -Method POST https://192.168.240.1:443/recive/$name?result=$sendback
它认为名称和后面的一切都是一个变量,我知道这一点,因为我可以在windwindows终端中看到所有突出显示的绿色
补充jswanson的有效解决方案:
当在第一个变量后名称字符之前使用`
(一个反勾号,PowerShell的转义字符(始终是一个选项时(在无引号和双引号的参数中(,有一种直接的方法可以在(隐式(可扩展字符串中描绘变量名:将名称封装在{...}
中,例如${name}
:
Write-Output https://192.168.240.1:443/receive/${name}?result=$sendback
虽然像${name}?
这样的东西比$name`?
更难键入,但它有两个明显的优点:
- 它可读性更强(视觉上与众不同(
- 它适用于所有的情况,而
`
-转义post-name字符可能会意外地将该字符变成转义序列;例如变量$foo
后面应该跟文字bar
:Write-Output $foo`bar
-已损坏,因为`b
变成退格字符Write-Output ${foo}bar
-正常,感谢{...}
外壳
可选阅读:为什么PowerShell允许在标识符(变量名(中使用?
大多数脚本和编程语言都不允许?
成为变量名等标识符的一部分,这通常是因为?
是元字符(具有特殊含义的字符(。
尽管PowerShell中的?
也有特殊含义,但根据上下文,允许标识符(变量名、函数名、别名等(中的?
。
一方面,PowerShell允许标识符包含异常字符,这是值得称赞的,但对于此类名称[1],需要{...}
外壳是有意义的,这确实是其他异常字符所需要的,尤其是.
和-
:
# 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条件运算符?.
和?[]
。
例如,假设我希望对变量$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
执行预期的null条件访问。
{...}
在这种情况下是必需的,即使名称$var
本身不包含特殊字符:
# OK, due to {...} - but this shouldn't be necessary
Set-StrictMode -Version 3; $var = Get-Item foo*.txt; ${var}?.Length
考虑到这是违反直觉和繁琐的,GitHub提案#11379要求改变这种行为。尽管从技术上讲,这是一个突破性的变化,但分析表明,在现实世界中,在?
中使用以结尾的变量名的情况非常罕见,相反,这种使用通常是错误的,即基于对尾随?
是而不是变量名的一部分的期望。
[1]注意,给定只有变量名称,而不是函数。。。,支持{...}
外壳,这将限制包含变量名称的?
正如@Abraham Zinala所暗示的,通用的Backtick(`(是PowerShell中的转义字符。您可以通过更改反勾号在中的位置来验证效果
echo https://192.168.240.1:443/recive/$name?result=$sendback
我相信你要找的是这个
echo https://192.168.240.1:443/recive/$name`?result=$sendback