Как ввести многострочную команду - PullRequest
349 голосов
/ 13 июля 2010

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

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

Ответы [ 9 ]

530 голосов
/ 13 июля 2010

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

Get-ChildItem -Recurse `
  -Filter *.jpg `
  | Select LastWriteTime

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

Get-ChildItem |
  Select Name,Length

будет работать без проблем, так как после | команда не может быть завершена, так как отсутствует другой элемент конвейера.Также открывающиеся фигурные скобки или любые другие виды скобок позволят непосредственно продолжить строку:

$x=1..5
$x[
  0,3
] | % {
  "Number: $_"
}

Подобно | запятая также будет работать в некоторых контекстах:

1,
2

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

return
  5

не будет работать.

Наконец, строки (во всех вариантах) могут также выходить за пределы одной строки:

'Foo
bar'

Они включают разрывы строк в пределахзатем строка.

57 голосов
/ 06 августа 2012

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

34 голосов
/ 13 июля 2010

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

Синтаксический анализатор PowerShell распознает, когда утверждение явно не завершено, и смотрит на следующеелиния.Например, представьте командлет, который принимает необязательный параметр блока скрипта:

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

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

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

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

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

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

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

    if (condition) {
        .....
    }

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

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

    $project.Items | 
        ? { $_.Key -eq "ProjectFile" } | 
        % { $_.Value } | 
        % { $_.EvaluatedInclude } |
        % {
            .........
        }
27 голосов
/ 08 февраля 2012

Расширить на ответ Кристобалито :

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

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

Например:

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

powershell -Command "&{$cert=Get-ChildItem –Path cert:\CurrentUser\my -codeSigningCert ; Set-AuthenticodeSignature -filepath Z:\test.ps1 -Cert $cert}
16 голосов
/ 03 февраля 2016

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

3 голосов
/ 16 февраля 2017

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

$header =    "Make," +

             "ComputerName," +

             "Model," +

             "Windows Version"

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

$header = "Make,ComputerName,Model,Windows Version"
2 голосов
/ 13 июля 2010

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

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

1 голос
/ 13 декабря 2018
  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"
0 голосов
/ 20 февраля 2019

Существует так много способов продолжить строку в powershell, с помощью пробелов, скобок, скобок, операторов, точек, даже с запятой.Вот блог об этом: https://get -powershellblog.blogspot.com / 2017/07 / bye-bye-backtick-natural-line.html

Вы можете продолжить сразу после таких утверждений, какforeach, а если и так.

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