Задача запустить из 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
А что вы думаете по этому поводу?