当PowerShell看到以字符串开头的命令时,它仅对字符串进行求值,即通常将其回显到屏幕,例如:
PS> "Hello World"
Hello World
如果希望PowerShell将字符串解释为命令名称,请使用调用运算符(&),如下所示:
PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'
之后,您可能只需要引用包含空格和/或引用字符的参数/参数对。当您使用复杂的命令行参数调用像这样的EXE文件时,拥有一个将向您展示PowerShell如何将参数发送到EXE文件的工具通常非常有帮助。在PowerShell的社区扩展有这样的工具。它称为echoargs。您只需用echoargs替换EXE文件-保留所有参数,这将向您展示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 Bug提交进行投票。
有关PowerShell如何解析的更多信息,请查看我的有效PowerShell博客系列 -特别是项目10-“了解PowerShell解析模式”
2012年4月4日更新:这种情况在PowerShell V3中变得更容易处理。有关详细信息,请参见此博客文章。