我想通过 PS1 (PSCore) 脚本在 Azure Postgres 灵活服务器上运行命令。 密码可以包含诸如
<
和 )
之类的字符,PSCore 解析器会阻塞这些字符。
我正在尝试使用
az postgres flexible-server execute
命令。 我认为这更多的是 PS1 脚本问题,而不是 Postgres 或 az postgres
问题。
命令示例:
az postgres flexible-server execute -n the-instance-name -u theName -p the%WeIRDbutSecure#PasswordE<JMCiOw<>IQ) -d theDatabase -q "select * from MyTable"
我收到如下错误:
ParserError:
Line |
1 | … he-instance-name -u theName -p the%WeIRDbutSecure#PasswordE<JMCiOw<>IQ) -d theDatabase …
| ~
| Unexpected token ')' in expression or statement.
我尝试将
the%WeIRDbutSecure#PasswordE<JMCiOw<>IQ)
分配给局部变量。 这将问题转移到:
> was unexpected at this time.
我尝试将整个字符串放在双引号和单引号中。 两者都不起作用——同样的
> was unexpected at this time.
错误。 我还尝试在字符串中嵌入单个反引号字符,如下所示:
the%WeIRDbutSecure#PasswordE`<JMCiOw`<`>IQ`)
但继续出现相同的
> was unexpected at this time.
错误。
我的最终目标是将此命令行命令嵌入到稍后执行的 PS1 脚本中。
是否有人能够传递包含 PS1 想要在指令中解释的字符的
-p
密码? 您如何转义这些字符或整个密码?
tl;博士
通过
cmd /c
致电解决问题。cmd /c @"
az postgres flexible-server execute -n the-instance-name -u theName -p "the%WeIRDbutSecure#PasswordE<JMCiOw<>IQ)" -d theDatabase -q "select * from MyTable"
"@
从根本上讲,与在任何 shell 中一样,您需要quote包含 shell 元字符的单词,例如
)
- 有关 "..."
(可扩展)和
'...'
(逐字)的详细信息,请参阅 about_Quoting_Rules字符串。
... -p 'the%WeIRDbutSecure#PasswordE<JMCiOw<>IQ)' ...
不幸的是,因为
az
是作为批处理文件实现的(az.cmd
),在这种情况下这不够(正如您所观察到的):
且不加引号,因此,即使您在 PowerShell 端正确引用了不含空格的参数,它也是如此仍将 unquoted 放在进程命令行上。
大多数 CLI,但不适用于 cmd.exe
(批处理文件的解释器 (
*.cmd
,
*.bat
)),它不恰当地将批处理文件的命令行解析为如果它是从 inside a 提交的命令行
cmd.exe
会议。
<
和
|
break 此类批处理文件调用。
GitHub 问题 #15143 是一项建议,旨在让 PowerShell 适应 cmd.exe
的怪癖以及其他备受瞩目的 CLI;遗憾的是它无处可去。