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

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


当前回答

这是一个老帖子,所以这是现代的方法。

如果您不使用遗留的powershell,那么延续行最干净的方法是在行开始处使用管道。

注意:该命令不会将某些行注释掉。这在命令行中非常有用。

> 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/ byye - byye -backtick-natural-line

其他回答

在大多数类c语言中,我都会将大括号放在我认为最容易阅读的地方。

PowerShell的解析器可以识别语句是否明显不完整,并查看下一行。例如,想象一个cmdlet,它接受一个可选的脚本块参数:

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

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

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

但这行不通:解析器将看到两条语句。第一个是Get-Foo,第二个是脚本块。相反,我写道:

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

我可以使用行延续字符('),但这会导致代码难以阅读,并引发错误。

因为这个例子要求左大括号在前一行,所以我到处都遵循这个模式:

    if (condition) {
        .....
    }

注意,如果语句需要语言语法中的脚本块,那么解析器将在下一行中查找脚本块,但为了一致性,我将左大括号保持在同一行中。

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

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

我刚刚发现,在后勾号和换行符之间一定没有任何字符。即使是空格也会导致命令不起作用。

如果你想把字符串分成多行,你可以使用“+”。例如:

$header =    "Make," +

             "ComputerName," +

             "Model," +

             "Windows Version"

看起来就像:

$header = "Make,ComputerName,Model,Windows Version"
$scriptBlock = [Scriptblock]::Create(@'
  echo 'before'
  ipconfig /all
  echo 'after'
'@)

Invoke-Command -ComputerName AD01 -ScriptBlock $scriptBlock

源 不要使用反引号

我开始的时候

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"
}