如何输入多行命令

eXX*_*XXL 379 powershell multiline

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

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

Joe*_*oey 576

您可以使用空格,然后使用重音(反引号):

Get-ChildItem -Recurse `
  -Filter *.jpg `
  | Select LastWriteTime
Run Code Online (Sandbox Code Playgroud)

但是,在上述情况下,这只是必要的.通常,当命令在该点语法上无法完成时,您将获得自动行继续.这包括启动一个新的管道元素:

Get-ChildItem |
  Select Name,Length
Run Code Online (Sandbox Code Playgroud)

|因为它缺少另一个管道元素,所以在命令无法完成之后将无问题地工作.同时打开花括号或任何其他类型的括号将允许直接继续行:

$x=1..5
$x[
  0,3
] | % {
  "Number: $_"
}
Run Code Online (Sandbox Code Playgroud)

类似于|逗号也可以在某些情况下使用:

1,
2
Run Code Online (Sandbox Code Playgroud)

请记住,虽然,类似于JavaScript的自动分号插入,也有一些事情,也同样打破,因为线路中断发生在那里的一个点由一个有效的声明之前:

return
  5
Run Code Online (Sandbox Code Playgroud)

不管用.

最后,字符串(各种类型)也可能超出一行:

'Foo
bar'
Run Code Online (Sandbox Code Playgroud)

它们包括字符串中的换行符.

  • 不,将这些其他字符记录下来以备将来参考是件好事. (13认同)
  • 显然,行继续在ISE命令窗格中不起作用. (10认同)
  • 并且不要忘记提及其他一些令牌也可以作为行继续符,例如`|`和`{`. (3认同)

Nef*_*ets 62

我发现后面的勾号和换行符之间一定不能有任何字符.即使是空格也会导致命令不起作用.

  • 虽然这在技术上不是问题的答案,但+1因为这绝对必要.我刚刚发现了这个问题,并且肯定会在可能的情况下避免在未来的发展中留下反差. (7认同)
  • **技术说明** - 这是因为反引号本身*不是*行继续运算符;它实际上是一个 *escape* 字符,用于“转义”行尾的换行符。如果您在反引号后输入空格,它将转义该空格而不是换行符。进一步阅读 [**PowerShell 中的自然行延续**](https://get-powershellblog.blogspot.com/2017/07/bye-bye-backtick-natural-line.html) (7认同)
  • 因此,在Powershell中基本上没有强大的方法来打破一条长线.难怪我倾向于每个人都看到[2个屏幕范围的PowerShell脚本](http://stackoverflow.com/questions/2608144/how-to-split-long-commands-over-multiple-lines-in-powershell)哪里.#摇摇头 (4认同)
  • 我也在努力解决这个问题...您可以在反勾号之前插入内联注释以包含注释,如下所示:Some-Command ` -arg1 <#解释arg 1 #>`-arg2 <#解释arg 2 #> (2认同)
  • 嗯 这使PowerShell代码不必要地难以发布到文档或网站中,因为担心如果使用Shift + Enter,该命令可能会被人读错,或者使用反勾号时会在ISE命令行中解析为错误。 (2认同)

Jay*_*uzi 36

在大多数类C语言中,我故意将我的括号放在我认为它们使代码最容易阅读的地方.

PowerShell的解析器识别语句明显不完整,并查看下一行.例如,假设一个带有可选脚本块参数的cmdlet:

    Get-Foo { ............ }

如果脚本块很长,你可能想写:

    Get-Foo
    {
        ...............
        ...............
        ...............
    }

但这不起作用:解析器将看到两个语句.第一个是Get-Foo第二个,第二个是脚本块.相反,我写道:

    Get-Foo {
        ...............
        ...............
        ...............
    }

我可以使用行继续符(`),但这会产生难以阅读的代码,并引发错误.

因为这种情况需要将开放式大括号放在上一行,所以我在任何地方都遵循这种模式:

    if (condition) {
        .....
    }

请注意,if语句需要语言语法中的脚本块,因此解析器将查看脚本块的下一行,但为了保持一致性,我将开括号保留在同一行.

同样地,在长管道的情况下,我在管道字符(|)之后断开:

    $project.Items | 
        ? { $_.Key -eq "ProjectFile" } | 
        % { $_.Value } | 
        % { $_.EvaluatedInclude } |
        % {
            .........
        }

  • @Nacht:"但这不起作用"指的是其他参数是可选的情况,这在大多数情况下都是如此. (2认同)

小智 28

扩展cristobalito的答案:

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

在命令行中,使用分号";"

例如:

在命令行上签署PowerShell脚本.没有换行符.

powershell -Command "&{$cert=Get-ChildItem –Path cert:\CurrentUser\my -codeSigningCert ; Set-AuthenticodeSignature -filepath Z:\test.ps1 -Cert $cert}
Run Code Online (Sandbox Code Playgroud)

  • 不是问题的答案,但你的答案回答了我的问题.:) (10认同)
  • 这很有趣,但这与OP的要求相反。OP 希望将单个命令拆分为多行;您解释了如何将多个命令组合到一行中。 (2认同)

Bad*_*Bad 16

在PowerShell和PowerShell ISE中,也可以在每行末尾使用Shift+ Enter进行多行编辑(而不是标准反引号`).

  • 这是编辑多行here字符串的一个不错的技巧,否则,如果您不知道`SHIFT-ENTER`技巧,就很难进行编辑。 (2认同)
  • 需要说明的是:1)PSReadline模块在控制台主机_only_(不是ISE)中工作。2)使用PSReadline时,Shift + Enter在控制台主机_only_中工作。3)Shift + Enter一直在ISE中起作用。4)如果使用不带PSReadline的控制台主机,则Shift + Enter在功能上等同于按Enter。 (2认同)
  • 这是正确的答案,被接受并有400投票的人非常困惑和无用!! (2认同)

Asa*_*eel 11

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


Jia*_*ang 6

只需在此处添加一个角落案例。它可能会为您节省 5 分钟。如果您使用一系列操作,则需要放置“.”。在行尾留一个空格,后跟“`”(反引号)。我发现这很困难。

$yourString = "HELLO world! POWERSHELL!". `
                  Replace("HELLO", "Hello"). `
                  Replace("POWERSHELL", "Powershell")
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您尝试将字符串分成多行,则可以使用“+”。例如:

$header =    "Make," +

             "ComputerName," +

             "Model," +

             "Windows Version"
Run Code Online (Sandbox Code Playgroud)

看起来就像:

$header = "Make,ComputerName,Model,Windows Version"
Run Code Online (Sandbox Code Playgroud)