
在 PowerShell 中使用 Azure CLI 创建资源时,若密码含圆括号 (),会因 PowerShell 和 CMD 双层解析导致语法错误;解决方法是用单引号包裹双引号字符串('"pass()"'),确保括号被原样传递给 CLI。
在 powershell 中使用 azure cli 创建资源时,若密码含圆括号 `()`,会因 powershell 和 cmd 双层解析导致语法错误;解决方法是用单引号包裹双引号字符串(`'"pass()"'`),确保括号被原样传递给 cli。
Azure CLI 本身不解析括号,但其 Windows 安装默认通过批处理脚本(.bat)调用 Python 解释器,该脚本在 CMD 环境下执行。而 PowerShell 在传递参数前会先解析字符串——特别是 ()、&、|、> 等字符具有特殊含义。当你写 $Pass = @("--admin-password", "Abcde12345()") 时,PowerShell 将 () 视为子表达式运算符(如 "$(Get-Date)"),即使内部为空也会触发解析逻辑;更严重的是,后续 CMD 层会将未转义的 () 当作批处理语法(如 if () 或命令分组),从而抛出 () was unexpected at this time 等致命错误。
✅ 正确做法:嵌套引号法 —— 使用单引号(PowerShell 字面量字符串)包裹一个带双引号的密码值,形如 '"Abcde12345()()"'。
- 外层单引号阻止 PowerShell 解析任何内容(包括
()、$、""等); - 内层双引号被完整保留,并由 CMD 层接收为参数值的一部分,最终透传至 Azure CLI 的 Python 进程。
以下是两种推荐写法:
方式一:使用数组参数(推荐用于复杂场景)
$Group = @("--resource-group", "rg-shared")
$Name = @("--name", "servy")
$User = @("--admin-user", "BigCahoona")
$Pass = @("--admin-password", '"Abcde12345()()"') # ← 关键:单引号 + 内部双引号
az sql server create $Group $Name $User $Pass
方式二:直接命令行(适合简单调用,注意反引号续行)
az sql server create ` --resource-group rg-shared ` --name servy ` --admin-user BigCahoona ` --admin-password '"Abcde12345()()"'
⚠️ 注意事项:
- ❌ 避免仅用双引号(
"Abcde12345()()"):PowerShell 可能提前解析或截断; - ❌ 避免反斜杠转义(如
"Abcde12345\(\)"):PowerShell 不支持对()的转义,CMD 也不识别; - ❌ 避免使用
$()、${}等变量语法:即使密码中不含$,也建议全程禁用可扩展字符串(即不用双引号定义密码); - ✅ 验证是否生效:创建成功后,可通过
az sql server list -g rg-shared --query "[?name=='servy'].administratorLoginPassword"(需配合--output tsv及权限)间接验证(注:CLI 默认不返回明文密码,实际密码以服务端为准); - ✅ 跨平台兼容提示:Linux/macOS Bash 中只需普通单引号
'Abcde12345()()'即可,无需嵌套;Windows PowerShell 是唯一需嵌套的常见环境。
总结:括号不是“不被支持”,而是被两层 shell(PowerShell → CMD)误解析。'"...()..."' 是经过验证的最小侵入式修复方案,兼顾安全性、可读性与向后兼容性。如需自动化批量设置,建议将密码存入 Azure Key Vault 并通过 @keyvault 引用,从根本上规避 CLI 参数解析风险。










