Azure CLI创建SQL Server时含括号的管理员密码导致执行异常问题求助
问题重现
你遇到的这个问题其实是Windows环境下PowerShell传递特殊字符给Azure CLI时的常见坑——因为Azure CLI在Windows底层是通过CMD调用Python脚本的,括号这类特殊字符会被CMD误解析成命令语法,导致执行异常。
先再明确下你的场景:
原本的PowerShell脚本运行完全正常:
$Group = @("--resource-group", "groupy") $Name = @("--name", "servy") $User = @("--admin-user", "BigCahoona") $Pass = @("--admin-password", "Abcde12345#¤%") az sql server create $Group $Name $User $Pass
但修改密码为含括号的内容后,出现两种异常情况:
- 当密码改为
Abcde12345()时,资源虽创建成功,但会抛出错误:C:\source\dev>echo Failed to load python executable.
Failed to load python executable.
C:\source\dev>exit /b 1 - 当密码改为
Abcde12345()()时,直接触发CMD语法错误,资源完全创建失败:() was unexpected at this time.
C:\source\dev> "C:\Program Files\Microsoft SDKs\Azure\CLI2\wbin..\python.exe" -IBm azure.cli
sql server create --resource-group groupy --name servy --admin-user BigCahoona --admin-password Abcde12345()()
解决方案
这里给你几个可行的解决办法,不用更换密码字符就能搞定:
1. 用单引号包裹密码字面量
在PowerShell里,单引号包裹的内容会被当作纯字符串,不会解析任何特殊字符(包括括号)。修改你的密码变量定义即可:
$Pass = @("--admin-password", 'Abcde12345()()')
之后正常执行az命令就行,PowerShell会把带括号的密码原封不动传递给Azure CLI,不会被CMD误解析。
2. 使用--%关闭PowerShell参数解析
在az命令前加上--%,这个符号会让PowerShell停止解析后续参数,直接把它们传递给底层CMD执行,完全避免特殊字符被错误解析:
# 注意:使用--%后,PowerShell的变量替换会失效,需要先拼接好完整参数 $fullCommand = "sql server create --resource-group groupy --name servy --admin-user BigCahoona --admin-password Abcde12345()()" az --% $fullCommand
如果你的参数是动态生成的,可以先把所有内容拼接成一个字符串,再用这种方式传递。
3. 用Invoke-Expression强制解析完整命令
把整个Azure CLI命令拼接成一个字符串,然后用Invoke-Expression执行,这样PowerShell会先处理变量,再把完整命令传递给CLI:
$Group = "--resource-group groupy" $Name = "--name servy" $User = "--admin-user BigCahoona" $Pass = "--admin-password Abcde12345()()" $command = "az sql server create $Group $Name $User $Pass" Invoke-Expression $command
不过要注意,Invoke-Expression处理不可信输入时有注入风险,但自己编写的脚本完全没问题。
为什么之前的转义没用?
你尝试的反斜杠、额外引号等是CMD里的转义方式,但在PowerShell里,这些规则不适用——PowerShell自身的解析逻辑会先处理一遍,导致转义字符被“吃掉”,到CMD层面还是没正确处理括号。用单引号或者--%才能跳过PowerShell的解析,让特殊字符原封不动到达Azure CLI。
备注:内容来源于stack exchange,提问作者Konrad Viltersten

