Запуск команды (программы) из PowerShell

Иногда из терминала или скрипта PowerShell нужно выполнить какую-то внешнюю команду, утилиту командной строки, или запустить исполняемый EXE файл программы. Эта статья разбирает часто используемые методы запуска программ и консольных утилит из PowerShell, в том числе позволяющие передать аргументы и получить в скрипте ответ от программы.

Обычно, если вам нужно запустить какую-то стандартную утилиту командой строки Windows (например, ping , tracert , diskpart и т.д.) из консоли PowerShell, достаточно указать ее имя и аргументы:

ping winitpro.ru

Однако это будет работать не для всех программ cmd, а только для тех, путь к которым содержится в переменной окружения PATH . То есть, как минимум системные утилиты и команды в каталогах %WINDIR% и %WINDIR%System32 можно запускать без указания абсолютного пути и каких-то дополнительных аргументов.

(Get-ChildItem env:Path).value -split ";"

Если же попытаться запустить произвольный исполняемый файл, который находится в текущем каталоге (в который вы перешли командой cd c:toolspstool), то при попытке запустить такую команду по имени появится ошибка:

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:Toolshandle64.exe

Для запуска внешних команд и программ из PowerShell скрипта также можно использовать оператор вызова (&). Используется такой синтаксис:

& <Command-String> <Arguments>

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

& 'C:Toolshandle64.exe'

Если нужно передать утилите через оператор вызова несколько аргументов, воспользуйтесь таким форматом:

$exe = "C:Toolshandle64.exe"
$arguments = '-u', '12696', '-nobanner'
& $exe $arguments

Можно использовать стандартную оболочку cmd.exe для прямого запуска программ из PowerShell. Например:

cmd.exe /c "echo Hello world from CMD"

Или:

cmd.exe /c "C:ToolsPSToolsPslist.exe firefox"

Такая команда запускает новый экземпляр cmd.exe , выполняет в ней команду, указанную в аргументе /c и выводит результат в консоль.

Для запуска произвольного приложения с аргументами можно использовать командлет Start-Process:

Start-Process -FilePath 'C:Program Filesmyapp.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:Toolshandle64.exe 12696 -u -nobanner"

$result=Invoke-Command -ScriptBlock {"C:Toolshandle64.exe 12696 -u -nobanner"}

Командлет Invoke-Command обычно используется для выполнения команд на удаленных компьютерах.


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *