Иногда из терминала или скрипта PowerShell нужно выполнить какую-то внешнюю команду, утилиту командной строки, или запустить исполняемый EXE файл программы. Эта статья разбирает часто используемые методы запуска программ и консольных утилит из PowerShell, в том числе позволяющие передать аргументы и получить в скрипте ответ от программы.
Обычно, если вам нужно запустить какую-то стандартную утилиту командой строки Windows (например,
ping
,
tracert
,
diskpart
и т.д.) из консоли PowerShell, достаточно указать ее имя и аргументы:
ping winitpro.ru
Однако это будет работать не для всех программ cmd, а только для тех, путь к которым содержится в переменной окружения
PATH
. То есть, как минимум системные утилиты и команды в каталогах
%WINDIR%
и
%WINDIR%\System32
можно запускать без указания абсолютного пути и каких-то дополнительных аргументов.
(Get-ChildItem env:Path).value -split ";"
Если же попытаться запустить произвольный исполняемый файл, который находится в текущем каталоге (в который вы перешли командой cd c:\tools\pstool), то при попытке запустить такую команду по имени появится ошибка:
psexec: The term 'psexec' is not recognized as a name of a cmdlet, function, script file, or executable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. Suggestion [3,General]: The command "psexec" was not found, but does exist in the current location. PowerShell does not load commands from the current location by default (see ''Get-Help about_Command_Precedence''). If you trust this command, run the following command instead:
Т.к. PowerShell по умолчанию не загружает команды из текущего каталога, для ее запуска нужно перед именем команду добавить точку и обратный слеш. Например, так:
.\psexec.exe
Либо для запуска команды нужно указать полный путь к ней:
C:\Tools\handle64.exe
Для запуска внешних команд и программ из PowerShell скрипта также можно использовать оператор вызова (&). Используется такой синтаксис:
& <Command-String> <Arguments>
Например, чтобы запустить утилиту командной строки и вывести ответ в консоль:
& 'C:\Tools\handle64.exe'
Если нужно передать утилите через оператор вызова несколько аргументов, воспользуйтесь таким форматом:
$exe = "C:\Tools\handle64.exe"
$arguments = '-u', '12696', '-nobanner'
& $exe $arguments
Можно использовать стандартную оболочку cmd.exe для прямого запуска программ из PowerShell. Например:
cmd.exe /c "echo Hello world from CMD"
Или:
cmd.exe /c "C:\Tools\PSTools\Pslist.exe firefox"
Такая команда запускает новый экземпляр
cmd.exe
, выполняет в ней команду, указанную в аргументе /c и выводит результат в консоль.
Для запуска произвольного приложения с аргументами можно использовать командлет Start-Process:
Start-Process -FilePath 'C:\Program Files\myapp.exe' -ArgumentList 'DC01' -NoNewWindow -Wait
По умолчанию командлет Start-Process ничего не возвращает, но с помощью параметра -PassThru можно сделать так, чтобы он вернул объект процесса:
$result_process = Start-Process ping -ArgumentList "-n 1 ya.ru" -NoNewWindow -Wait -PassThru
После этого можно получить информацию о процессе (в том числе PID, код выхода и т.д.:
$result_process.ExitCode
Если вам нужно из PowerShell запустить внешнюю команду (программу) и получить от нее результат, который в дальнейшем вы будете как-то обрабатывать в скрипте, можно использовать командлеты Invoke-Expression или Invoke-Command
$result=Invoke-Expression -Command "cmd.exe /c C:\Tools\handle64.exe 12696 -u -nobanner"
$result=Invoke-Command -ScriptBlock {"C:\Tools\handle64.exe 12696 -u -nobanner"}