是否可以将PowerShell命令行拆分为多行?
在Visual Basic中,我可以使用下划线(_
)继续下一行中的命令。
答案 0 :(得分:522)
您可以使用空格后跟重音符(反引号):
Get-ChildItem -Recurse `
-Filter *.jpg `
| Select LastWriteTime
然而,在上述情况下,这只是必要的。通常,当命令在该点语法上无法完成时,您将获得自动行继续。这包括启动一个新的管道元素:
Get-ChildItem |
Select Name,Length
将无问题地工作,因为|
命令无法完成,因为它缺少另一个管道元素。同时打开花括号或任何其他类型的括号将允许直接继续行:
$x=1..5
$x[
0,3
] | % {
"Number: $_"
}
与|
类似,逗号在某些情况下也会起作用:
1,
2
请注意,与JavaScript的Automatic Semicolon Insertion类似,有些内容同样会被破坏,因为换行符发生在 前面有效语句的位置:
return
5
无效。
最后,字符串(各种类型)也可能超出一行:
'Foo
bar'
它们包括字符串中的换行符。
答案 1 :(得分:56)
我发现在后面的刻度和换行符之间一定不能有任何字符。即使是空格也会导致命令不起作用。
答案 2 :(得分:34)
在大多数类C语言中,我有意将我的括号放在我认为最容易阅读的代码中。
PowerShell的解析器识别语句明显不完整,并查看下一行。例如,假设一个cmdlet采用可选的脚本块参数:
Get-Foo { ............ }
如果脚本块很长,您可能想写:
Get-Foo { ............... ............... ............... }
但这不起作用:解析器将看到两个语句。第一个是Get-Foo
,第二个是脚本块。相反,我写道:
Get-Foo { ............... ............... ............... }
我可以使用行继续符(`)但这会产生难以阅读的代码,并会引发错误。
因为这种情况要求开放式大括号位于前一行,所以我随处可见:
if (condition) { ..... }
请注意,
if
语句需要语言语法中的脚本块,因此解析器将查看脚本块的下一行,但为了保持一致性,我将开放式大括号保留在同一行。
同样地,在长管道的情况下,我在管道字符(|
)之后中断:
$project.Items | ? { $_.Key -eq "ProjectFile" } | % { $_.Value } | % { $_.EvaluatedInclude } | % { ......... }
答案 3 :(得分:27)
我假设您在命令行上谈论 - 如果它在脚本中,那么新行>充当命令分隔符。
在命令行中,使用分号“;”
例如:
在命令行上签署PowerShell脚本。没有换行符。
powershell -Command "&{$cert=Get-ChildItem –Path cert:\CurrentUser\my -codeSigningCert ; Set-AuthenticodeSignature -filepath Z:\test.ps1 -Cert $cert}
答案 4 :(得分:14)
在PowerShell和PowerShell ISE中,还可以在每行末尾使用 Shift + Enter 进行多行编辑(而不是标准反引号{{1} })。
答案 5 :(得分:3)
如果您尝试将字符串分成多行,则可以使用" +"。例如:
$header = "Make," +
"ComputerName," +
"Model," +
"Windows Version"
看起来就像:
$header = "Make,ComputerName,Model,Windows Version"
答案 6 :(得分:2)
我假设您在命令行上谈论 - 如果它在脚本中,则新行充当命令分隔符。
在命令行中,使用分号“;”
答案 7 :(得分:2)
只需在此处添加一个角盒即可。这样可以为您节省5分钟。如果使用一系列动作,则需要输入“。”。在行尾,留一个空格,后跟“`”(反引号)。我发现这很困难。
$yourString = "HELLO world! POWERSHELL!". `
Replace("HELLO", "Hello"). `
Replace("POWERSHELL", "Powershell")
答案 8 :(得分:1)
我从做起
if ($true) {
"you can write multiple lines here, and the command doesn't run untill you close the bracket"
"like this"
}
最近发现我可以
&{
get-date
"more stuff"
}
答案 9 :(得分:0)
;
分隔命令\\
上替换双反斜杠\
。 "'
传递安全地址以切换“ PATH”之类的命令。此ps1命令安装区域设置pfx证书。
powershell -Command "$pfxPassword = ConvertTo-SecureString -String "12345678" -Force -AsPlainText ; Import-PfxCertificate -FilePath "'C:\\Program Files\\VpnManagement\\resources\\assets\\cert\\localhost.pfx'" Cert:\\LocalMachine\\My -Password $pfxPassword ; Import-PfxCertificate -FilePath "'C:\\Program Files\\VpnManagement\\resources\\assets\\cert\\localhost.pfx'" Cert:\\LocalMachine\\Root -Password $pfxPassword"
答案 10 :(得分:0)
$scriptBlock = [Scriptblock]::Create(@'
echo 'before'
ipconfig /all
echo 'after'
'@)
Invoke-Command -ComputerName AD01 -ScriptBlock $scriptBlock
答案 11 :(得分:0)
只需使用`字符分隔多行命令
答案 12 :(得分:0)
如果您不使用旧版 powershell,最简洁的续行方式是 行首 处的 pipe
。
注意:该命令不会因注释掉某些行而中断。这在命令行上很棒。
> Get-ChildItem -path 'c:\' -Depth 1
| Sort-Object LastWriteTime
# | Sort-Object Length -Descending
| Select-Object -First 3 -Skip 3
| Foreach-Object {
$_.Name, $_.Length | Join-String -Separator ' = '
}
输出:
explorer.exe = 4826160
procexp.old.exe = 2925760
RtlExUpd.dll = 2839488
不幸的是 windows powershell 不支持它。上面链接了一堆替代方案。您可以完全删除反引号:2017/07/bye-bye-backtick-natural-line
答案 13 :(得分:-1)
有许多方法可以在powershell中继续显示行,包括管道,括号,括号,运算符,点,甚至带逗号。这是关于它的博客:https://get-powershellblog.blogspot.com/2017/07/bye-bye-backtick-natural-line.html
您可以在紧接foreach之类的语句之后继续操作,也可以继续。