POST 请求变量 powershell

问题描述

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

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

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

解决方法

补充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] 请注意,鉴于只有 变量 名称,而不是函数,...,支持 {...} 外壳,这将限制包含 ?变量名。

,

正如@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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...