是否可以将PowerShell命令行拆分为多行?
在Visual Basic中,我可以使用下划线(_)来继续下一行中的命令。
_
我假设您谈论的是命令行——如果是在脚本中,那么new-line充当命令分隔符。
在命令行中,使用分号';'
你可以在空格后面加严肃重音(反撇号):
Get-ChildItem -Recurse ` -Filter *.jpg ` | Select LastWriteTime
但是,只有在如上所示的情况下才需要这样做。通常,当一个命令在语法上不能完整时,您会得到自动续行。这包括启动一个新的管道元素:
Get-ChildItem | Select Name,Length
将工作没有问题,因为在|之后,命令不能完成,因为它缺少另一个管道元素。同时,开大括号或任何其他类型的括号将允许直接续行:
|
$x=1..5 $x[ 0,3 ] | % { "Number: $_" }
与|类似,逗号也可以在某些上下文中使用:
1, 2
但是,请记住,与JavaScript的自动插入分号类似,有一些东西也会被破坏,因为换行符出现在是前面有有效语句的位置:
return 5
不会起作用。
最后,字符串(在所有类型中)也可以扩展到单行以外:
'Foo bar'
然后,它们在字符串中包含换行符。
在大多数类c语言中,我都会将大括号放在我认为最容易阅读的地方。
PowerShell的解析器可以识别语句是否明显不完整,并查看下一行。例如,想象一个cmdlet,它接受一个可选的脚本块参数:
Get-Foo { ............ }
如果脚本块非常长,你可能想写:
Get-Foo { ............... ............... ............... }
但这行不通:解析器将看到两条语句。第一个是Get-Foo,第二个是一个脚本块。相反,我写道:
Get-Foo
我可以使用行延续字符('),但这会导致代码难以阅读,并引发错误。
因为这个例子要求左大括号在前一行,所以我到处都遵循这个模式:
if (condition) { ..... }
注意,if语句需要语言语法中的脚本块,因此解析器将在下一行中查找脚本块,但为了一致性,我将左大括号保持在同一行中。
if
类似地,在长管道的情况下,我在管道字符(|)之后中断:
$project.Items | ? { $_.Key -eq "ProjectFile" } | % { $_.Value } | % { $_.EvaluatedInclude } | % { ......... }
展开cristobalito的回答:
我假设您谈论的是命令行——如果是在脚本中,那么新行>充当命令分隔符。 在命令行中,使用分号';'
我假设您谈论的是命令行——如果是在脚本中,那么新行>充当命令分隔符。
例如:
在命令行上签署PowerShell脚本。没有换行。
powershell -Command "&{$cert=Get-ChildItem –Path cert:\CurrentUser\my -codeSigningCert ; Set-AuthenticodeSignature -filepath Z:\test.ps1 -Cert $cert}
我刚刚发现在后面的勾号和换行符之间不能有任何字符。即使是空格也会导致命令不起作用。
在PowerShell和PowerShell ISE中,也可以在每行的末尾使用转变 + 输入进行多行编辑(而不是标准的反标记`)。
`
如果你想把字符串分成多行,你可以使用“+”。例如:
$header = "Make," + "ComputerName," + "Model," + "Windows Version"
看起来就像:
$header = "Make,ComputerName,Model,Windows Version"
;
\\
\
"'
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"
在powershell中有很多方法来继续一行,用管道,括号,圆括号,操作符,点,甚至用逗号。这里有一个关于它的博客:https://get-powershellblog.blogspot.com/2017/07/bye-bye-backtick-natural-line.html
你也可以在foreach和if语句之后继续。
$scriptBlock = [Scriptblock]::Create(@' echo 'before' ipconfig /all echo 'after' '@) Invoke-Command -ComputerName AD01 -ScriptBlock $scriptBlock
在多行中使用`字符分隔命令
只要在这里加上一个极端情况。这可能会帮你节省5分钟。如果你使用一连串的动作,你需要在行末加上“。”,然后在“'”后面留下一个空格(反勾号)。这是我很不容易才发现的。
$yourString = "HELLO world! POWERSHELL!". ` Replace("HELLO", "Hello"). ` Replace("POWERSHELL", "Powershell")
我开始的时候
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" }
如果你不使用传统powershell,最干净的方式是在行头处使用pipe。
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
在windows终端(powershell配置文件),我可以简单地单击Shift-Enter对我来说很好。
Shift-Enter
PS C:\xxx2021> Get-ChildItem -Include *remote* -Recurse | >> Sort-Object -Property LastWriteTime -Descending | >> Select-Object LastWriteTime, Name -First 25 LastWriteTime Name ------------- ---- 12/5/2021 5:04:02 PM remote-control-car-BatteryPack-Number-2021-12-03.pdf PS C:\xxx2021>enter code here