当 PowerShell 看到以字符串开头的命令时,它只会评估该字符串,也就是说,它通常会将其回显到屏幕上,例如:
PS> "Hello World"
Hello World
如果您希望 PowerShell 将字符串解释为命令名称,请使用调用运算符 (&),如下所示:
PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'
之后,您可能只需要引用包含空格和/或引号字符的参数/参数对。当您使用复杂的命令行参数调用这样的 EXE 文件时,拥有一个工具通常会非常有帮助,该工具将向您展示 PowerShell 如何将参数发送到 EXE 文件。PowerShell Community Extensions就有这样的工具。它被称为回声参数。您只需将 EXE 文件替换为 echoargs - 保留所有参数,它将向您展示 EXE 文件将如何接收参数,例如:
PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.\mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>
使用 echoargs 您可以进行试验,直到正确为止,例如:
PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>
事实证明,我之前太努力维护连接字符串周围的双引号。显然这不是必需的,因为即使是 cmd.exe 也会删除它们。
顺便说一句,向 PowerShell 团队致敬。它们非常有助于向我展示单引号和双引号的特定咒语以获得所需的结果 - 如果您需要保留内部双引号。:-) 他们也意识到这是一个痛苦的领域,但他们受到受特定问题影响的人数的驱动。如果这对您来说是一个痛苦的领域,那么请投票支持这个PowerShell 错误提交。
有关 PowerShell 如何解析的更多信息,请查看我的Effective PowerShell 博客系列- 特别是第10 项 - “了解 PowerShell 解析模式”
2012 年 4 月 4 日更新:这种情况在 PowerShell V3 中变得更容易处理。有关详细信息,请参阅此博客文章。