【问题标题】:How to escape ampersands, semicolons, and curly braces in command-line powershell params?如何在命令行 powershell 参数中转义与号、分号和花括号?
【发布时间】:2016-07-08 15:43:36
【问题描述】:

我正在使用一个 powershell 脚本来生成一个包含数据库密码等的配置文件。该脚本的正常使用是生成并使用密码,但是一时之间,我需要访问一个开发人员的数据库,所以我需要将密码传递给 powershell 脚本。

问题在于密码是乱码,包括与号、分号和花括号。如何将其传递给 powershell 的命令行调用? (This answer 和这个 other answer 很有帮助,但对分号和花括号没有帮助。)

这是我尝试过的:

powershell .\makeConfig.ps1 -password "xxx<xxxx;xxxxx&x.xxxx}xx/xxx" -otherparam 3

结果:错误消息:不允许使用与号 (&) 字符。 & 运算符保留供将来使用;用双包裹一个&符号 引号 ("&") 将其作为字符串的一部分传递。

powershell .\makeConfig.ps1 -password "xxx<xxxx;xxxxx`"&`"x.xxxx}xx/xxx" -otherparam 3

结果:执行 $password 的写入主机只会将字符串提供到分号。另外,-otherparam 有它的默认值,而不是我传入命令行的值。

powershell .\makeConfig.ps1 -password "xxx<xxxx`;xxxxx`"&`"x.xxxx}xx/xxx" -otherparam 3

结果:write-host $password 现在打印到引号前的第一个反引号。是的,它输出了反引号,这似乎表明一切都在解析错误。哦,脚本中调用的其他函数之一引发了我以前从未见过的异常​​(使用“4”参数调用“AcquireToken”的异常:“authentication_canceled:用户取消身份验证”),这表明参数解析完全以一种新的和迷人的方式进行。下面是 write-host $password 产生的内容:

xxx<xxxx;xxxxx`


powershell .\makeConfig.ps1 -password "xxx<xxxx`";`"xxxxx`"&`"x.xxxx}xx/xxx" -otherparam 3

结果:write-host $password 现在打印到引号前的第一个反引号。而第二个参数是默认状态。 (即,与上次相同的结果。)从好的方面来说,上一个示例中抛出的异常没有出现。

那么如何从 Windows 命令行将任意 ASCII 字符串传递给 powershell 字符串参数?或者至少,我如何转义分号、& 和花括号?

【问题讨论】:

    标签: powershell parameters cmd


    【解决方案1】:
    powershell .\makeConfig.ps1 -password "'xxx<xxxx;xxxxx&x.xxxx}xx/xxx'" -otherparam 3
    

    这里

    • 外部" 双引号将转义所有cmd 有毒字符,例如&lt;&amp; 等,除了 " 本身和 % 百分号(以及 ! 感叹号,如果 delayed expansion 已启用)而
    • 内部的' 撇号(单引号)将转义所有powershell' 撇号本身除外)。

    但是,上面注意到的异常也可以被转义...... 基于转义字符、分隔符和引号文章:

    【讨论】:

    • 这对我不起作用。我试图将 heroku 配置设置为 mongo url,它有一个 &。我不得不交换引号。所以对我来说,不是"'blah'",而是'"blah"'
    • @Akshay 尝试使用"""bl&amp;ah""" 而不是"'bl&amp;ah'";收到的字符串(检查$args)将变为"bl&amp;ah"而不是'bl&amp;ah'
    • 这似乎不适用于 PowerShell 6。
    【解决方案2】:

    我正在使用 powershell 脚本运行 firebase。我通过使用这样的三重双引号解决了这个问题:firebase deploy --token "$firebaseToken" --project "$firebaseProject" --message """$releaseMessage"""。 URL 在$releaseMessage 中,和号不再造成问题。

    【讨论】:

    • 在尝试了单引号、双引号、在&符号前面加上反引号并像接受的答案一样混合它们之后,没有一个工作。但是使用三重双引号有效!
    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    相关资源
    最近更新 更多