如何在 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"
空白很重要。所需格式为 Space`Enter。
另一种更简洁的参数传递方法是 splatting。
将您的参数和值定义为哈希表,如下所示:
$params = @{ 'class' = 'Win32_BIOS';
'computername'='SERVER-R2';
'filter'='drivetype=3';
'credential'='Administrator' }
然后像这样调用你的命令行开关:
Get-WmiObject @params
Microsoft 文档:About Splatting
TechNet 杂志 2011:Windows PowerShell: Splatting
Looks like it works with Powershell 2.0 and up
$params.add('name','Bob Newhart')
ramblingcookiemonster.wordpress.com/2014/12/01/…
啊,如果你有一个很长的字符串想要分解,比如 HTML,你可以通过在外部 "
的每一侧放置一个 @
来实现 - 如下所示:
$mystring = @"
Bob
went
to town
to buy
a fat
pig.
"@
你得到这个:
Bob
went
to town
to buy
a fat
pig.
如果您使用 Notepad++,它甚至会正确突出显示为字符串块。
现在,如果您希望该字符串也包含双引号,只需添加它们,如下所示:
$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++ 不会意识到这一点,并且会根据情况切换语法着色,就好像它没有被引用或引用一样。
更好的是:在您插入 $ 变量的任何地方,它都会被解释! (如果你需要文本中的美元符号,你可以用这样的勾号转义它:``$not-a-variable`。)
注意!如果您不将最后的 "@
放在行首,它将失败。我花了一个小时才发现我不能在我的代码中缩进!
以下是关于该主题的 MSDN:Using Windows PowerShell “Here-Strings”
您可以使用反引号运算符:
& "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"
这对我来说还是有点太长了,所以我会使用一些有名的变量:
$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: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
)
另一种将字符串拆分为多行的方法是将一个空表达式放在字符串的中间,然后将其拆分为多行:
示例字符串:
"stackoverflow stackoverflow stackoverflow stackoverflow stackoverflow"
断线:
"stackoverflow stackoverflow $(
)stackoverflow stack$(
)overflow stackoverflow"
在 PowerShell 5 和 PowerShell 5 ISE 中,也可以仅使用 Shift + Enter 进行多行编辑(而不是每行末尾的标准反引号 `
) :
PS> &"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" # Shift+Enter
>>> -verb:sync # Shift+Enter
>>> -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" # Shift+Enter
>>> -dest:contentPath="c:\websites\xxx\wwwroot,computerName=192.168.1.1,username=administrator,password=xxx"
带计算的 Splat 方法
如果您选择 splat 方法,请注意使用其他参数进行的计算。在实践中,有时我必须先设置变量,然后再创建哈希表。此外,该格式不需要在键值或分号周围加上单引号(如上所述)。
Example of a call to a function that creates an Excel spreadsheet
$title = "Cut-off File Processing on $start_date_long_str"
$title_row = 1
$header_row = 2
$data_row_start = 3
$data_row_end = $($data_row_start + $($file_info_array.Count) - 1)
# use parameter hash table to make code more readable
$params = @{
title = $title
title_row = $title_row
header_row = $header_row
data_row_start = $data_row_start
data_row_end = $data_row_end
}
$xl_wksht = Create-Excel-Spreadsheet @params
注意:文件数组包含将影响电子表格填充方式的信息。