如何输入多行命令

是否可以将PowerShell命令行拆分为多行?

在Visual Basic中,我可以使用下划线(_)来继续下一行中的命令。

536630 次浏览

我假设您谈论的是命令行——如果是在脚本中,那么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语句需要语言语法中的脚本块,因此解析器将在下一行中查找脚本块,但为了一致性,我将左大括号保持在同一行中。

类似地,在长管道的情况下,我在管道字符(|)之后中断:

$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"
  1. 使用分号;分隔命令
  2. 将双反斜杠\\替换为任意反斜杠\
  3. 使用"'将安全地址传递给switch命令,如“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中有很多方法来继续一行,用管道,括号,圆括号,操作符,点,甚至用逗号。这里有一个关于它的博客: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
< p > # EYZ0 < br > # EYZ0 < / p >

在多行中使用`字符分隔命令

只要在这里加上一个极端情况。这可能会帮你节省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

enter image description here

注意:该命令不中断一些行被注释掉。这在命令行中非常有用。

> 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 (Version <6)

不幸的是,windows powershell不支持它。上面链接了一堆替代方案。您可以完全删除反引号:2017/07 / bye-bye-backtick-natural-line

在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