如何输入多行命令

时间:2010-07-13 09:36:17

标签: powershell multiline

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

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

14 个答案:

答案 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)

展开cristobalito's answer

  

我假设您在命令行上谈论 - 如果它在脚本中,那么新行>充当命令分隔符。

     

在命令行中,使用分号“;”

例如:

在命令行上签署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)

  1. 使用分号;分隔命令
  2. 在所有反斜杠\\上替换双反斜杠\
  3. 使用"'传递安全地址以切换“ 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

source
don't use backquote

答案 11 :(得分:0)

只需使用`字符分隔多行命令

答案 12 :(得分:0)

这是一篇旧帖子,所以这里是现代方法。

如果您不使用旧版 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(版本 <6)

不幸的是 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之类的语句之后继续操作,也可以继续。