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


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

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, которая позволяет контролировать, обрабатываются ли выходные данные в stderr как ошибка. Дополнительные сведения см. в $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.