首页 > 解决方案 > 为变量转义 Powershell 中的所有密码特殊字符

问题描述

我有以下场景,在 Powershell v5 上运行:

Powershell 脚本在批量 for-each 循环中从 API 调用中提取几位信息到第 3 方系统,并将它们分配给变量。提取的信息包括密码(这样做是为了摆脱上述第 3 方系统并将其迁移到不允许您以纯文本形式检索密码的东西):

$userset = Invoke-WebRequest -Method Post -Uri "https://$Url/path/to/api.asmx" -Headers $Headers -Body $usercall

$xmluserset = [xml] $userset.Content

$userset2 = $xmluserset.Envelope.Body.UserSettingsResult.settingValues.string

$userpasstemp = $userset2[1].trimstart("password")
$userpass = $userpasstemp.trimstart("=")

然后在脚本的其他地方使用这些密码。

例如,它们被传递给不同的 API,并且需要采用 URL 兼容格式,因此我运行以下命令:

$urlescapeduserpass = [uri]::EscapeDataString($userpass)

适用于脚本的该部分

问题是这些密码可以包含任何特殊字符:!"#$%&'()*+,-./:;<=>?@[]^_`{|}~

当我调用脚本的另一部分时,密码字符串中的特殊字符会导致失败并且脚本退出。使用任一调用命令时会发生这种情况:

& .\application.exe --option1 $option1 --user1 $user --password1 $userpass

或使用调用表达式时

$command = "$path\application.exe  --option1 $option1 --user1 $user --password1  $userpass"
Invoke-Expression $command

我尝试使用正则表达式,使用 -replace cmdlet:

$escapedpass = $userpass -replace ' !"#$%&()*+,-./:;<=>?@[\]^_`{|}~', '`$&'

但是没有运气,我知道类似于 [uri]escapedatastring,Regex 有一个类似的,但似乎没有一个本地的 Powershell。我确定有一个 [contenttype] 将具有本机功能来转义特殊字符或某种方式来实现最终结果。

标签: powershellescapingspecial-characterspowershell-5.0

解决方案


因为PowerShell 对传递给外部程序的参数中嵌入字符的处理被破坏"(从 PowerShell 7 开始) - 请参阅此答案-您需要手动 \转义"字符串中嵌入的字符:

$escapedpass = $userpass -replace , '"', '\"'

在您的命令上下文中:

& .\application.exe --option1 $option1 --user1 $user --password1 ($userpass -replace , '"', '\"')

推荐阅读