Поделиться через


Выполнение команд в оболочке

PowerShell — это оболочка командной строки и язык сценариев, используемый для автоматизации. Аналогично другим оболочкам, например bash в Linux или командной оболочке Windows (cmd.exe), PowerShell позволяет выполнять любую команду, доступную в системе, а не только команды PowerShell.

Типы команд

Для любой оболочки в любой операционной системе существует три типа команд:

  • Ключевые слова языка оболочки являются частью сценарного языка оболочки.

    • Примеры ключевых слов bash: if, then, else, elifи fi.
    • Примеры ключевых слов cmd.exe: dir, copy, move, ifи echo.
    • Примеры ключевых слов PowerShell: for, foreach, try, catchи trap.

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

  • нативные команды ОС — это исполняемые файлы, установленные в операционной системе. Исполняемые файлы можно запускать из любой оболочки командной строки, например PowerShell. К ним относятся файлы скриптов, требующие правильной работы других оболочков. Например, если вы запускаете пакетный скрипт Windows (.cmd файл) в PowerShell, PowerShell выполняет cmd.exe и передает пакетный файл для выполнения.

  • команды оболочки, специфичные для среды, — это команды, определенные во внешних файлах, которые могут использоваться только в среде выполнения оболочки. К ним относятся скрипты, функции и модули, добавляющие команды в среду выполнения оболочки. В PowerShell эти команды, добавленные модулем, называются командлетами (произносится как "command-lets").

Выполнение встроенных команд

Любая собственная команда может выполняться из командной строки PowerShell. Обычно выполняется команда точно так же, как и в bash или cmd.exe. В следующем примере демонстрируется запуск команды grep в bash в Ubuntu Linux.

sdwheeler@circumflex:~$ grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
sdwheeler@circumflex:~$ pwsh
PowerShell 7.2.6
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

После запуска PowerShell в Ubuntu можно выполнить ту же команду из командной строки PowerShell:

PS /home/sdwheeler> grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash

Передача аргументов встроенным командам

Большинство оболочк включают функции для использования переменных, оценки выражений и обработки строк. Но каждая оболочка делает эти вещи по-разному. В PowerShell все параметры начинаются с символа дефиса (-) . В cmd.exeбольшинстве параметров команды используется символ косой черты (/). Другие средства командной строки могут использовать пробелы, дефисы, двойные дефисы (--).

Каждая оболочка имеет собственный способ обработки и оценки строк в командной строке. При выполнении встроенных команд в PowerShell, которые ожидают, что строки будут заключены в кавычки определённым образом, может потребоваться изменить способ передачи этих строк.

Дополнительные сведения см. в следующих статьях:

PowerShell 7.2 представила новую экспериментальную функцию PSNativeCommandArgumentPassing, которая улучшила собственную обработку команд. Дополнительные сведения см. в $PSNativeCommandArgumentPassing.

Обработка выходных данных и ошибок

PowerShell также имеет несколько дополнительных выходных потоков, чем другие оболочки. Оболочки bash и cmd.exe имеют stdout и stderr. PowerShell имеет шесть выходных потоков. Дополнительную информацию см. в разделе about_Redirection и about_Output_Streams.

Как правило, выходные данные, отправленные в stdout собственной командой, отправляются в поток success в PowerShell. Выходные данные, отправляемые в stderr собственной командой, отправляются в поток ошибки в PowerShell.

Если встроенная команда возвращает ненулевой код выхода, $? задано значение $false. Если код выхода равен нулю, $? получает значение $true.

Однако PowerShell 7.2 изменил это поведение. Записи ошибок, перенаправленные из собственных команд, например при использовании операторов перенаправления (2>&1), не записываются в переменную PowerShell $Error, а переменная предпочтения $ErrorActionPreference не влияет на перенаправленные выходные данные.

Многие собственные команды записываются в stderr в качестве альтернативного потока для получения дополнительных сведений. Это поведение может привести к путанице в PowerShell при просмотре ошибок, а дополнительные выходные данные могут быть потеряны, если $ErrorActionPreference задано состояние, которое отключает выходные данные.

PowerShell 7.3 добавил новую экспериментальную функцию PSNativeCommandErrorActionPreference, которая позволяет управлять тем, как обрабатывать ненулевые коды завершения из встроенных команд. Дополнительные сведения см. в $PSNativeCommandUseErrorActionPreference.

Выполнение команд PowerShell

Как упоминалось ранее, команды PowerShell называются командлетами. Командлеты собираются в модули PowerShell, которые можно загружать по мере необходимости. Командлеты можно писать на любом скомпилированном языке .NET или с помощью самого языка сценариев PowerShell.

Команды PowerShell, выполняющие другие команды

Оператор вызова PowerShell (&) позволяет выполнять команды, хранящиеся в переменных и представленные строками или блоками скриптов. Оператор можно использовать для выполнения любой собственной команды или команды PowerShell. Это полезно в скрипте, если необходимо динамически создавать параметры командной строки для собственной команды. Дополнительные сведения см. у оператора вызова .

Командлет Start-Process следует использовать для выполнения встроенных команд, но только при необходимости управлять выполнением команды. Командлет имеет параметры для поддержки следующих сценариев:

  • Выполнение команды с помощью различных учетных данных
  • Скрытие окна консоли, созданного новым процессом
  • Перенаправьте поток stdin в, поток stdout ви поток stderr в
  • Использование другого рабочего каталога для команды

В следующем примере выполняется собственная команда sort.exe с перенаправленными входными и выходными потоками.

$processOptions = @{
    FilePath = "sort.exe"
    RedirectStandardInput = "TestSort.txt"
    RedirectStandardOutput = "Sorted.txt"
    RedirectStandardError = "SortError.txt"
    UseNewEnvironment = $true
}
Start-Process @processOptions

Для получения дополнительной информации см. Start-Process.

В Windows командлет Invoke-Item выполняет действие по умолчанию для указанного элемента. Например, он запускает исполняемый файл или открывает файл документа с помощью приложения, связанного с типом файла документа. Действие по умолчанию зависит от типа элемента и поставщика PowerShell, предоставляющего доступ к элементу.

В следующем примере откроется репозиторий исходного кода PowerShell в веб-браузере по умолчанию.

Invoke-Item https://github.com/PowerShell/PowerShell

Дополнительные сведения см. в разделе Invoke-Item.