Главная

Thursday, 8 September 2022

Запуск внешней программы из PowerShell.

Всем привет.

Задача запустить из PowerShell какой либо исполняемый файл  (программу или утилиту командной строки) встречается достаточно часто. Последний раз я с этим столнкнулся бувкально на днях когда правил шаблон BGinfo. PowerShell предлагает для этого несколько различных способов, которые рассмотрим далее.

Я рассматриваю универсальный случай когда под внешнюю программу подставляют командный файл, уже из которого после можно вызвать что душа пожелает.

$exec = "d:\1st.cmd"

Секция прямого вызова:

.$exec

& $exec

cmd /c $exec


Секция  Invoke-командлетов:

Invoke-Expression -Command $exec

Invoke-Item -Path $exec

Invoke-Command -ScriptBlock {& $exec}


Секция Process-командлета:

Start-Process -FilePath $exec


Секция .NET:

[System.Diagnostics.Process]::Start($exec)


$process = New-Object -TypeName System.Diagnostics.Process

$process.StartInfo.FileName = $exec

$process.StartInfo.Arguments = "Hello world!"

$process.StartInfo.RedirectStandardOutput = $true

$process.StartInfo.UseShellExecute = $false

$process.Start()

$process.WaitForExit()

$out = $process.StandardOutput.ReadToEnd()


Секция WMI-вызовов:

$startup=[wmiclass]"Win32_ProcessStartup"

$startup.Properties['ShowWindow'].value=$True

([wmiclass]"win32_Process").create($exec)


Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList $exec


Invoke-CimMethod -ClassName Win32_Process -MethodName Create -Arguments @{CommandLine=$exec}

На этом можно было бы поставить точку. Однако стоит провести анализ среди приведенных методов какие из них позволяют получить коды возврата об успешном запуске внешнего файла, а также какие из них позволяют прочитать(перехватить) весь stdout от внешнего файла если таковой будет. Это может быть важно.

Удачи.

No comments:

Post a Comment

А что вы думаете по этому поводу?