powershell - 为变量转义 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] 将具有本机功能来转义特殊字符或某种方式来实现最终结果。
解决方案
因为PowerShell 对传递给外部程序的参数中嵌入字符的处理被破坏"
(从 PowerShell 7 开始) - 请参阅此答案-您需要手动 \
转义"
字符串中嵌入的字符:
$escapedpass = $userpass -replace , '"', '\"'
在您的命令上下文中:
& .\application.exe --option1 $option1 --user1 $user --password1 ($userpass -replace , '"', '\"')
推荐阅读
- javascript - 对于类似代码,JavaScript 给出的结果与 C++ 不同
- c - 如何在c语言中将true分配给布尔变量
- php - 为什么 Symfony 的 UploadedFile `getClientOriginalName()` 被认为是不安全的?
- flask - 返回的数组引用相同的内存点但返回不同的值
- r - Pandoc 2.7.3 版无法将 knitr .tex 文件转换为 .docx
- r - 关于 R 中 rpart 和 gbm 的一些问题
- apache - AH00558:httpd:无法可靠地确定服务器的完全合格
- python - 是否可以添加项目符号以绘制在 jupyter 幻灯片中呈现的输出?
- javascript - 如果我已经定义了 ID,如何将数组插入到我的 MongoDB 缝合中?
- python - 意外中断的 cProfile