是否可以将 PowerShell 命令行拆分为多行?
在 Visual Basic 中,我可以使用下划线 (_
) 继续下一行中的命令。
sh
命令提交脚本,则 bash 约定适用,因此您可以使用反斜杠。在这种情况下,您的脚本也应该有 unix 风格的结尾。
您可以使用空格后跟重音(反引号):
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'
然后,它们在字符串中包含换行符。
我刚刚发现,反勾号和换行符之间不能有任何字符。即使是空格也会导致命令不起作用。
在大多数类似 C 的语言中,我故意将大括号放在我认为它们使代码最容易阅读的地方。
PowerShell 的解析器会识别出明显不完整的语句,并查看下一行。例如,想象一个带有可选脚本块参数的 cmdlet:
Get-Foo { ............ }
如果脚本块很长,您可能需要编写:
Get-Foo { ............... ............... ............... }
但这不起作用:解析器将看到两个语句。第一个是 Get-Foo
,第二个是脚本块。相反,我写道:
Get-Foo { ............... ............... ............... }
我可以使用续行字符 (`),但这会导致代码难以阅读,并且会引起错误。
因为这种情况需要左大括号在前一行,所以我到处都遵循这个模式:
if (condition) { ..... }
请注意,如果语句需要语言语法中的脚本块,因此解析器将在下一行查找脚本块,但为了保持一致性,我将左大括号保留在同一行。
同样,在长管道的情况下,我在管道字符 (|
) 之后中断:
$project.Items | ? { $_.Key -eq "ProjectFile" } | % { $_.Value } | % { $_.EvaluatedInclude } | % { ......... }
if
和 foreach
和 try
是如何工作的呢?他们允许下一行的脚本块......这意味着它是可能的
我假设您在命令行上谈论 - 如果它在脚本中,那么换行符 > 充当命令分隔符。在命令行上,使用分号 ';'
例如:
在命令行上签署 PowerShell 脚本。没有换行符。
powershell -Command "&{$cert=Get-ChildItem –Path cert:\CurrentUser\my -codeSigningCert ; Set-AuthenticodeSignature -filepath Z:\test.ps1 -Cert $cert}
在 PowerShell 和 PowerShell ISE 中,还可以在每行的末尾使用 Shift + Enter 进行多行编辑(而不是标准的反引号 `
)。
SHIFT-ENTER
技巧,否则编辑起来会很糟糕。
PSReadLine
模块或等效模块时,PowerShell 的控制台版本才会出现这种情况。在标准的 Windows 控制台输入函数中,Enter
和 Shift+Enter
在功能上是等效的。
PSReadline
模块在控制台主机中工作仅(不是 ISE)。 2) Shift+Enter
仅在使用 PSReadline
时在控制台主机中工作。 3) Shift+Enter
一直在 ISE 中工作。 4) 如果使用不带 PSReadline
的控制台主机,Shift+Enter
在功能上等同于按 Enter
。
只需在此处添加一个角落案例。它可能会为您节省 5 分钟。如果你使用一个动作链,你需要放“.”。在行尾,留一个空格,后跟“`”(反引号)。我发现这很困难。
$yourString = "HELLO world! POWERSHELL!". `
Replace("HELLO", "Hello"). `
Replace("POWERSHELL", "Powershell")
Replace("HELLO", "Hello"). # comment here
如果您尝试将字符串分成多行,则可以使用“+”。例如:
$header = "Make," +
"ComputerName," +
"Model," +
"Windows Version"
看起来就像:
$header = "Make,ComputerName,Model,Windows Version"
我开始做
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"
}
只需使用 `
字符来分隔多行命令
我假设您在命令行上谈论 - 如果它在脚本中,那么换行符充当命令分隔符。
在命令行上,使用分号 ';'
使用分号;分隔命令在任何反斜杠 \ 上替换双反斜杠 \\。使用 "' 传递安全地址以切换命令,如 "'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"
这是一个旧帖子,所以这是现代方法。
如果您使用的不是旧版 Powershell,最简洁的续行方式是 行首 处的 pipe
。
https://i.stack.imgur.com/pZMVu.png
注意:该命令不会因注释掉某些行而中断。这在命令行上很棒。
> 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(版本 < 6)
不幸的是 windows powershell 不支持它。上面链接了一堆替代方案。您可以完全删除反引号:2017/07/bye-bye-backtick-natural-line
有很多方法可以在 powershell 中继续一行,使用管道、括号、括号、运算符、点,甚至使用逗号。这是一篇关于它的博客:https://get-powershellblog.blogspot.com/2017/07/bye-bye-backtick-natural-line.html
您也可以在 foreach 和 if 等语句之后继续。
@
splat 运算符似乎不是必需的)。例如:$params = @( '-v', '-X', 'GET'); curl $params http://example.org
。不是 '-X GET'
,而是需要两个单独的元素。并且不要调用变量 $args
,它是保留的。
curl '-v', '-X', 'GET', 'http://example.org'
。这篇文章的建议是使用带有 splatting 的变量来提高可读性。顺便说一句:如果写在一行上并且如果你删除了参数之间的空格,那么它会突然中断吗? curl '-v','-X','GET','http://example.org'
- curl: option -v,-X,GET,http://example.org: is unknown
。任何参数之间的单个空格使其再次工作。
$scriptBlock = [Scriptblock]::Create(@'
echo 'before'
ipconfig /all
echo 'after'
'@)
Invoke-Command -ComputerName AD01 -ScriptBlock $scriptBlock
在 Windows 终端(powershell 配置文件)中,我只需单击 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
addLine
-> Set-PSReadLineKeyHandler -Chord 'shift+enter' -Function AddLine
|
和{
。