PowerShell如何转义&符号 解决Azure自动化SAS密钥传递截断问题
解决方案
你遇到的问题本质是两层特殊字符解析导致的:第一层是PowerShell语法解析时对双引号和&的转义规则不匹配,第二层是PowerShell调用外部命令azcopy时,&作为保留字符被提前解析截断。
步骤1:修正&转义的语法错误
你之前的替换写法不符合PowerShell的转义规则,正确的转义写法有两种可选:
- 用单引号包裹替换值(单引号内的内容不会被PowerShell解析):
$sasKey = $sasKey.Replace('&', '"&"')
- 用反引号`(PowerShell的官方转义符)转义双引号:
$sasKey = $sasKey.Replace("&", "`"&`"")
以上两种写法都不会再报Unexpected token '&'的语法错误。
步骤2:修复MyFunc内azcopy的调用逻辑
azcopy是外部可执行程序,PowerShell调用外部程序时会额外解析一次参数中的特殊字符,所以需要加停止解析符避免&被截断,修改azcopy copy行即可:
# 方案A:加--%停止解析符,PowerShell不会再解析后续参数的特殊字符 azcopy copy $sourcePath $destPath --recursive --% # 方案B:显式给目标路径包裹两层双引号,适配外部命令的参数解析规则 azcopy copy $sourcePath "`"$destPath`"" --recursive
更简便的免转义方案
你也可以不对SAS密钥提前做&替换,仅在调用azcopy时加停止解析符即可,避免转义逻辑出错:
- 删掉
sasKey的&替换代码,直接保留New-AzStorageAccountSASToken生成的原始值 - 仅修改MyFunc内的azcopy调用行,加
--%停止解析符即可
可以通过你写入的c:\upload\log.txt先确认传入VM的sasKey是否完整,再验证azcopy的执行结果。
内容的提问来源于stack exchange,提问作者Blue Clouds
相关产品推荐
相关产品推荐

