如何在PowerShell中通过多行分割长命令

如何在PowerShell中使用这样的命令并将其分成多行:

&"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" -dest:contentPath="c:\websites\xxx\wwwroot\,computerName=192.168.1.1,username=administrator,password=xxx" 

尾随反引号字符即

 &"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" ` -verb:sync ` -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" ` -dest:contentPath="c:\websites\xxx\wwwroot,computerName=192.168.1.1,username=administrator,password=xxx" 

另一个更简洁的论点传递的方法是泼溅 。

定义你的参数和值作为这样的散列表:

 $params = @{ 'class' = 'Win32_BIOS'; 'computername'='SERVER-R2'; 'filter'='drivetype=3'; 'credential'='Administrator' } 

然后像这样调用你的commandlet:

 Get-WmiObject @params 

Windows PowerShell:Splatting 。

看起来像它和Powershell 2.0一起工作。

啊,如果你有一个很长的string,你可以通过在外部的每一边放一个@ ,比如说:

 $mystring = @" Bob went to town to buy a fat pig. "@ 

你得到了这个:鲍勃去城里买了一头肥猪。

如果您使用的是Notepad ++,甚至可以正确突出显示string块。 现在,如果你想让这个string包含双引号,只需将它们添加进来,就像这样:

 $myvar = "Site" $mystring = @" <a href="http://somewhere.com/somelocation"> Bob's $myvar </a> "@ 

你会得到这个:

 <a href="http://somewhere.com/somelocation"> Bob's Site </a> 

但是,如果在那个@string中使用双引号,Notepad ++不会意识到这一点,并根据具体情况将语法着色切换为不引号或引号。

而更好的是:在任何地方你插入一个$variables,它会得到解释! (如果你需要文本中的美元符号,你可以用下面的勾号标记来逃避它: `$not-a-variable

注意! 如果你不把最后的"@放在最前面 ,那就会失败,我花了一个小时才弄明白,我的代码中没有这个缩进!

这里是msdn的主题: http ://technet.microsoft.com/library/ee692792.aspx?ppud =4

您可以使用反引号操作符:

 & "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" ` -verb:sync ` -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" ` -dest:contentPath="c:\websites\xxx\wwwroot\,computerName=192.168.1.1,username=administrator,password=xxx" 

这对我的口味来说还是有点太长了,所以我会使用一些有名的variables:

 $msdeployPath = "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" $verbArg = '-verb:sync' $sourceArg = '-source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web"' $destArg = '-dest:contentPath="c:\websites\xxx\wwwroot\,computerName=192.168.1.1,username=administrator,password=xxx"' & $msdeployPath $verbArg $sourceArg $destArg 

如果你有一个function

 $function:foo | % Invoke @( 'bar' 'directory' $true ) 

如果你有一个Cmdlet

 [PSCustomObject] @{ Path = 'bar' Type = 'directory' Force = $true } | New-Item 

如果你有一个应用程序

 {foo.exe @Args} | % Invoke @( 'bar' 'directory' $true ) 

要么

 icm {foo.exe @Args} -Args @( 'bar' 'directory' $true ) 

在PowerShell 5和PowerShell 5 ISE中,也可以使用SHIFT+ENTER进行多行编辑(而不是每行末尾的标准反引号):

 PS> &"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" >>> -verb:sync >>> -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" >>> -dest:contentPath="c:\websites\xxx\wwwroot,computerName=192.168.1.1,username=administrator,password=xxx"