$output = cmd /c ""C:\Program Files '(x86)\PostgreSQL\9.3\bin\psql.exe" -t -d testdb1 -U myname -c "SELECT 1 FROM pg_database WHERE datname = 'testdb2'""
返回错误:
> 'testdb <<<< '"" is missing the terminator: '.
如何修复此错误?我已经使用""
来包装cmd的整个参数并使用单引号&#39;逃避开放式支架(
答案 0 :(得分:1)
引用完全取消你的尝试并且应该是不必要的(除非Postgres实际上寻找cmd
因为它的父进程,我发现这是不太可能的)。请注意,PowerShell 是一个shell,因此运行外部命令并不常见或困难。将它们包裹在cmd /c
或Invoke-Expression
或两者中几乎不需要。
& 'C:\Program Files (x86)\PostgreSQL\9.3\bin\psql.exe' -t -d testdb1 -U myname -c "SELECT 1 FROM pg_database WHERE datname = 'testdb2'"
应该实际工作(而且更简单)。
如果您的程序具有异常的命令行参数语法,其中PowerShell的自动引用和参数解析会干扰,您可以使用停止解析标记(--%
):
PS Home:\> args --% (5 + 4) $foo (gci C:\)
argv[0] = H:\Batches\args.cmd
argv[1] = (5
argv[2] = +
argv[3] = 4)
argv[4] = $foo
argv[5] = (gci
argv[6] = C:\)
请注意,这些情况很少见,但通常人们会尝试通过堆叠层层解析来解决这种情况,通常是使用Invoke-Expression
,因为他们不能更好地理解。实际上不需要调用外部命令。
答案 1 :(得分:0)
你忘了一些""
你可以试试以下内容吗?你不需要逃避括号:
$output = "cmd /c ""C:\Program Files (x86)\PostgreSQL\9.3\bin\psql.exe"" -t -d testdb1 -U myname -c ""SELECT 1 FROM pg_database WHERE datname = 'testdb2'"""