ChatGPT解决这个技术问题 Extra ChatGPT

如何在 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"

M
Myrddin Emrys

尾随反引号字符,即

&"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。


这似乎破坏了命令历史记录(向上箭头)功能;因为每一行都显示为一个单独的命令。有没有解决的办法?
如果您正在运行 powershell 3 或更高版本,请参阅 github.com/lzybkr/psreadline - 多行语句的历史遍历是固定的。
反勾号前面的空格是必需的#learned-the-hard-way
@josh-graham 在反引号之后不应该有任何空格(或内联注释)。 #艰难地学习
反引号很脆弱(如上面的评论所述)并且在解析或查看文件时很难找到。如果您想更轻松地调试代码,@StevenPenny 的答案会更好。
s
spottedmahn

另一种更简洁的参数传递方法是 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/…
分号可以,但是是多余的。仅当每行有多个值时才需要。
这不适用于普通的 shell 命令,主要是 PowerShell commandlet
这应该是新接受的答案。喷溅是当今非常标准的事情。
P
Peter Mortensen

啊,如果你有一个很长的字符串想要分解,比如 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`。)

注意!如果您不将最后的 "@ 放在行首,它将失败。我花了一个小时才发现我不能在我的代码中缩进!

以下是关于该主题的 MSDNUsing Windows PowerShell “Here-Strings”


巧妙的技巧,但如果我有一个变量 $... 它似乎不起作用。我得到“这里的字符串标题之后不允许使用该字符......”
我不认为你可以打破一个变量名,只是一个字符串。
A
Aaron Jensen

您可以使用反引号运算符:

& "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

我喜欢变量名而不是其他建议,因为它可能是非 powershell 专家最易读的选项。如果我看到使用 splatting 的教程/设置指南,如果没有关于 splatting 的子教程,我会完全迷失在发生的事情上。同样,反引号似乎很脆弱,并且可能不如简单的尝试和真实的 PS 变量那么广为人知。
P
Peter Mortensen

如果你有一个功能:

$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
)

K
Kirill Yunussov

另一种将字符串拆分为多行的方法是将一个空表达式放在字符串的中间,然后将其拆分为多行:

示例字符串:

"stackoverflow stackoverflow stackoverflow stackoverflow stackoverflow"

断线:

"stackoverflow stackoverflow $(
)stackoverflow stack$(
)overflow stackoverflow"

B
Bad

在 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"

M
Mark

带计算的 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

注意:文件数组包含将影响电子表格填充方式的信息。