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


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

PowerShell — это оболочка командной строки и язык сценариев в одной системе, используемый для автоматизации. Аналогично другим оболочкам, таким как bash или командная оболочка 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 эти команды называются командлетами.

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

Любую собственную команду можно выполнить из командной строки 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), не записываются в переменную $Error PowerShell, а привилегированная переменная $ErrorActionPreference не влияет на перенаправленные выходные данные.

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

В PowerShell 7.3 добавлена новая экспериментальная функция PSnativeCommandErrorActionPreference, которая позволяет управлять тем, будут ли выходные данные stderr обрабатываться как сообщение об ошибке. Дополнительные сведения см. в разделе PSnativeCommandErrorActionPreference.

Выполнение команд 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.