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

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

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

ping winitpro.ru

Запуск команд cmd из PowerShell консоли

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

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

список путей в переменной окружения Path

Если же попытаться запустить произвольный исполняемый файл, который находится в текущем каталоге (в который вы перешли командой 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 does not load commands from the current location by default

Т.к. PowerShell по умолчанию не загружает команды из текущего каталога, для ее запуска нужно перед именем команду добавить точку и обратный слеш. Например, так:

.\psexec.exe

запуск консольных команд из PowerShell через точку и обратный слеш

Либо для запуска команды нужно указать полный путь к ней:

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 и выводит результат в консоль.

Запуск команд из PowerShell через интерпретатор cmd.exe

Для запуска произвольного приложения с аргументами можно использовать командлет 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"

Запустить команду с параметрами и получить результаты от нее в PowerShell

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

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

Предыдущая статья Следующая статья


Комментариев: 0 Оставить комментарий

Оставить комментарий

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

Я не робот( Обязательно отметьте)