如何在命令行PowerShell参数中转义和分号以及大括号?
如何在命令行PowerShell参数中转义和分号以及大括号?
我正在使用Powershell脚本生成一个配置文件,其中包含数据库密码等内容。通常使用该脚本是生成并使用一个密码,但是在某一瞬间,我需要访问另一个开发人员的数据库,所以我需要将密码传递给Powershell脚本。
问题是密码是一些包含&、;和{}等符号的无意义字符。我该如何将其传递给Powershell的命令行调用?(这个答案和这个其他答案很有帮助,但是对于分号和花括号并没有帮助。)
以下是我尝试过的方法:
powershell .\makeConfig.ps1 -password "xxx
结果:错误消息:不允许使用&字符。&运算符保留用于将来使用;使用双引号将&包裹起来以将其作为字符串的一部分传递。
powershell .\makeConfig.ps1 -password "xxx
结果:对$password进行write-host只显示到分号为止的字符串。此外,-otherparam具有其默认值而不是我在命令行中传递的值。
powershell .\makeConfig.ps1 -password "xxx
结果:write-host $password现在只打印到引号前的第一个反引号。是的,它输出了反引号,这似乎表明一切都解析错了。哦,还有脚本中调用的另一个函数抛出了我以前没见过的异常(Exception calling "AcquireToken" with "4" argument(s): "authentication_canceled: User canceled authentication"),这表明参数解析完全被搞砸了。以下是write-host $password的输出:
xxx
结果:write-host $password现在只打印到引号前的第一个反引号。第二个参数处于默认状态。(即与上次结果相同)好的一方面是,在前一个示例中抛出的异常没有出现。
那么,我如何从Windows命令行中将任意ASCII字符串传递给Powershell字符串参数?或者至少,我如何转义分号、&和花括号?
在命令行PowerShell参数中,如果要传递包含“&”、“;”和“{}”的字符,可能会遇到问题。下面的代码片段展示了一个问题的例子,其中包含了一个由多个查询字符串组成的GET URI的SAS令牌:
az storage blob copy start `
--destination-blob $destinationVHDFileName `
--destination-container $storageContainerName `
--account-name $storageAccountName `
--account-key $storageAccountKey `
--source-uri """$sas""" `
--debug `
--verbose
解决这个问题的方法是使用三重引号将包含特殊字符的参数值括起来。在上述代码片段中,使用了三重引号将变量$sas的值括起来,以确保特殊字符被正确处理。
希望这个解决方法对于遇到类似问题的人们有所帮助。
问题的原因是在命令行powershell参数中使用特殊字符如"、&、;和{}时,可能会导致错误。解决方法是使用引号来转义这些特殊字符,具体方法如下:
- 外层双引号将转义所有cmd命令中的特殊字符,如<、&等,但不包括双引号自身和百分号(%),并且不包括感叹号(!)(如果启用了延迟扩展)。例如:powershell .\makeConfig.ps1 -password "'xxx<xxxx;xxxxx&x.xxxx}xx/xxx'" -otherparam 3
- 内层单引号将转义所有powershell命令中的特殊字符,不包括单引号自身。例如:'"blah"'
- 除了使用引号转义外,还可以使用其他方法来转义特殊字符,具体方法可以参考相关文档。
需要注意的是,上述方法在PowerShell 6中可能不起作用,可能需要尝试其他解决方案。
问题的原因是在使用命令行PowerShell参数时,需要转义特殊符号,如&、;和花括号。在这个例子中,用户运行了一个名为firebase的命令,并使用Powershell脚本解决了问题。通过使用三个双引号来转义参数中的特殊符号,问题得到解决。
解决方法是使用三个双引号来包裹参数中的特殊符号。在这个例子中,用户使用以下命令成功解决了问题:firebase deploy --token "$firebaseToken" --project "$firebaseProject" --message """$releaseMessage"""
。通过在参数中使用三个双引号,特殊符号&不再引起问题。
在尝试使用单引号、双引号、在特殊符号前加上重音符号以及混合使用它们的情况下,都没有起作用。但是使用三个双引号可以解决问题。
正如用户BlackMiracle所描述的经历一样,我也有完全相同的经历。尝试了其他所有方法后,第一次我的脚本完美地运行起来。