Как ввести многострочную команду

Можно ли разбить командную строку PowerShell на несколько строк?

В Visual Basic я могу использовать подчеркивание (_) для продолжения команды в следующей строке.

Ответ 1

Вы можете использовать пробел с последующим серьезным акцентом (backtick):

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'

Они включают разрывы строк внутри строки, затем.

Ответ 2

Я только что узнал, что не должно быть никакого символа между обратным тиком и разрывом строки. Даже пробел заставит команду не работать.

Ответ 3

В большинстве C-подобных языков я преднамеренно размещаю свои фигурные скобки, где, по-моему, они делают код более легким для чтения.

Парсер PowerShell распознает, когда отчет явно не завершен, и смотрит на следующую строку. Например, представьте себе командлет, который принимает необязательный параметр блока script:
    Get-Foo { ............ }

если блок script очень длинный, вы можете написать:

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

Но это не сработает: синтаксический анализатор увидит два оператора. Первый - Get-Foo, а второй - блок script. Вместо этого я пишу:

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

Я мог бы использовать символ продолжения строки (`), но это делает трудно читаемый код и вызывает ошибки.

Поскольку этот случай требует, чтобы открытая фигурная скобка находилась на предыдущей строке, я следую этому шаблону повсюду:

    if (condition) {
        .....
    }

Обратите внимание, что в операторах if требуется блок script в грамматике языка, поэтому анализатор будет выглядеть в следующей строке для блока script, но для согласованности я сохраняю открытую фигурку в той же строке.

Иначе, в случае длинных конвейеров, я прерываю символ трубы (|):

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

Ответ 4

Чтобы расширить на cristobalito ответ:

Я предполагаю, что вы говорите о командной строке - если это в сценарии, то новая строка> действует как разделитель команд.

В командной строке используйте точку с запятой ';'

Например:

Подпишите сценарий PowerShell в командной строке. Без разрывов строк.

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

Ответ 5

В PowerShell и PowerShell ISE также можно использовать Shift + Enter в конце каждой строки для многострочного редактирования (вместо стандартного обратного удара ').

Ответ 6

Если вы пытаетесь разделить строки на несколько строк, вы можете использовать "+". Например:

$header =    "Make," +

             "ComputerName," +

             "Model," +

             "Windows Version"

Будет выглядеть так:

$header = "Make,ComputerName,Model,Windows Version"

Ответ 7

Я предполагаю, что вы говорите в командной строке - если это в script, то новая строка действует как разделитель команд.

В командной строке используйте запятую ';'

Ответ 8

  1. Используйте точку с запятой ; отделить команду
  2. Замените двойную обратную косую черту \\ на любую обратную косую черту \.
  3. Используйте "' для передачи безопасного адреса для переключения команды, например "ПУТЬ".

Эта команда 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"