Поиск по сайту:

Как использовать Start-Process в PowerShell


Чтобы запустить приложение, процесс или скрипт из PowerShell, вы можете просто ввести путь к файлу. Но это запустит процесс в той же среде и в том же контексте, что и ваша сессия PowerShell.

Когда вы хотите запустить процесс от имени другого пользователя, начните его в новом окне или даже запустите несколько процессов одновременно, вам нужно будет использовать командлет Start-Process.

В этой статье мы рассмотрим командлет start-process. Как мы можем запустить процесс с повышенными правами, выполнить его в новом окне или даже совершенно скрытым образом. Я также приведу вам несколько полезных примеров, чтобы начать.

Использование Start-Process в PowerShell

Команда Start-Process позволяет запускать один или несколько процессов на вашем компьютере из PowerShell. Она предназначена для асинхронного выполнения процесса или для запуска приложения/скрипта с повышенными полномочиями (с административными правами).

Вам не нужно использовать командлет Start-Process, если вам нужно запустить скрипт или другую консольную программу синхронно в PowerShell. Причина этого заключается в том, что вы можете перенаправить его вывод в PowerShell.

Это один из недостатков данного cmdlet: вы не можете перенаправить потоки вывода или ошибок в PowerShell. Единственный вариант, который у вас есть, это перенаправить вывод в текстовые файлы.

Итак, давайте рассмотрим, как использовать командлет. Мы можем использовать следующие параметры для запуска процесса:

-FilePath

Укажите файл, приложение или процесс для запуска

-ArgumentList

Указывает параметры, которые следует использовать для запуска процесса

-Credential

Учетная запись пользователя для запуска процесса с

-WorkingDirectory

Место, где должен начаться процесс

-NoNewWindow

Не открывайте новое окно для процесса

-RedirectStandardError

Укажите текстовый файл для перенаправления вывода ошибок

-RedirectStandardInput

Текстовый файл с входными данными для процесса

-RedirectStandardOutput

Укажите текстовый файл для переадресации вывода

-WindowStyle

Обычный, Скрытый, Свернутый или Максимизированный

-Wait

Подождите, пока процесс завершится, прежде чем продолжить выполнение скрипта.

-UseNewEnvironment

Процесс будет использовать свои собственные переменные окружения вместо переменных сеанса PowerShell.

Параметры Start-Process

Итак, чтобы просто открыть приложение с помощью PowerShell, мы можем использовать следующую команду:

Start-Process Notepad.exe

Simply typing notepad.exe in PowerShell will have the same result:
Notepad.exe 

Это откроет Блокнот в новом окне с теми же привилегиями, что и сессия PowerShell. Процесс выполняется асинхронно, что означает, что PowerShell продолжит выполнение скрипта, даже если процесс еще не завершен.

Ожидание завершения процесса

Наиболее распространенный способ начать процесс в PowerShell - это дождаться его завершения. Мы можем использовать параметр -wait для этого, который обеспечит то, что PowerShell будет ждать, пока процесс и все дочерние процессы не завершатся.

Допустим, у нас есть bat-файл, который мы хотим запустить из PowerShell и дождаться завершения процесса:

Start the process example.bat and wait for it to finish
Start-Process -FilePath "c:\temp\example.bat" -Wait

Запустить процесс Example.bat в новом окне

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

Размер окна и скрытые процессы

Если мы запустим bat-файл с приведённым выше примером, он выполнится в новом окне. Окно будет иметь обычный размер и закроется по завершении процесса. В cmdlet start-process мы можем указать размер окна или даже полностью его скрыть.

Мы можем выбрать между использованием параметров -WindowStyle и -NoNewWindow. Очевидно, что мы не можем использовать оба параметра одновременно 😉

Чтобы запустить bat-файл без каких-либо окон, мы можем использовать следующую команду в PowerShell:

Start the process example.bat, without any window and wait for it to finish
Start-Process -FilePath "c:\temp\example.bat" -Wait -WindowStyle Hidden

Вы не получите никакой обратной связи, кроме того, что ваш скрипт продолжит выполняться, когда процесс завершится. Однако мы можем перенаправить результат процесса в текстовый файл, об этом мы поговорим позже.

Чтобы запустить процесс в развернутом, нормальном или свернутом окне, вы можете использовать следующие параметры:

Default behavior:
Start-Process -FilePath "c:\temp\example.bat" -Wait -WindowStyle Normal

Maximized
Start-Process -FilePath "c:\temp\example.bat" -Wait -WindowStyle Maximized

Minimized
Start-Process -FilePath "c:\temp\example.bat" -Wait -WindowStyle Minimized

Еще одним параметром, который мы можем использовать, является -NoNewWindow. Это выполнит процесс в том же окне, что и скрипт PowerShell. Эта опция работает только с процессами, основанными на командной строке. Вы не можете, например, открыть Блокнот в том же окне, что и PowerShell.

Start-Process -FilePath "c:\temp\example.bat" -Wait -NoNewWindow

Запустите example.bat в том же окне PowerShell

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

Некоторые процессы или скрипты, которые вы хотите запустить, требуют параметров (аргументов). Вероятно, вы сначала подумали добавить аргументы в кавычках в путь, но, как вы могли заметить, это не сработает.

Чтобы передать аргументы процессу, который вы хотите запустить, вам нужно будет использовать параметр -arguments.

Давайте запустим MSI из PowerShell в качестве примера. Чтобы запустить MSI тихо, нам нужно будет предоставить аргументы /quiet или /qn, и, вероятно, мы также не хотим перезагружать, поэтому добавим /norestart.

Start-Process -FilePath "C:\temp\example.msi" -Wait -ArgumentList "/quiet /norestart"

Or arguments as string array:
Start-Process -FilePath "C:\temp\example.msi" -Wait -ArgumentList "/quiet","/norestart"

Запуск процесса PowerShell с повышенными правами

Когда вы запускаете процесс с помощью Start-Process, он будет работать в том же контексте пользователя, что и сессия PowerShell. Но некоторые процессы могут потребовать повышенных прав для запуска. Для этого мы можем использовать параметр -Verb.

Учтите, что вы не можете сочетать -Verb и -NoNewWindow, потому что процесс, который вы хотите запустить, должен быть открыт в новом окне.

Чтобы запустить example.bat с повышенными правами, мы можем использовать следующую команду:

Start-Process -FilePath "c:\temp\example.bat" -Wait -Verb RunAs

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

Запустить процесс от имени другого пользователя

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

Сначала вам нужно создать объект PSCredential и сохранить его как защищённую строку. Затем вы можете передать учетные данные команде cmdlet с параметром -Credential.

Имейте в виду, что защищенные строки не являются сверхбезопасными для использования, поэтому убедитесь, что вы храните защищенную строку как можно безопаснее.

Create credential object
You can store these also in a text file
$username = Read-Host "Enter your username"
$secureStringPwd = Read-Host -assecurestring "Please enter your password"

Create credential object
$credObject = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $secureStringPwd

Start-Process -FilePath "c:\temp\example.bat" -Wait -Credentials $credObject

Перенаправление вывода

Вывод команды Start-Process не может быть передан в PowerShell. Единственный вариант, который у нас есть, — это перенаправить вывод в текстовый файл. Переменные не сработают.

Итак, что вы можете сделать, чтобы захватить вывод, это:

Redirect the output to example-output.txt
Start-Process -FilePath "c:\temp\example.bat" -Wait -RedirectStandardOutput c:\temp\example-output.txt

Read the contents of example-output.txt
$output = Get-Content c:\temp\example-output.txt

Что не сработает, так это:

Storing the output into a variable will throw an error
Start-Process -FilePath "c:\temp\example.bat" -Wait -RedirectStandardOutput $output

$result will be empty
$result = Start-Process -FilePath "c:\temp\example.bat" -Wait

Если вы хотите зафиксировать только ошибку процесса, то можете использовать:

Start-Process -FilePath "c:\temp\example.bat" -Wait -RedirectStandardError c:\temp\example-output.txt

Получение идентификатора процесса

Последний параметр, который я хочу объяснить, это параметр -Passtru. Он вернет объект процесса запущенного процесса. Это может быть полезно, когда вы хотите автоматически остановить процесс, если он выполняется слишком долго.

$process = Start-Process "C:\temp\example.bat" -PassThru

Get the process ud
$process.ID

Wait 1 second
Start-Sleep 1

Kill the process
Stop-Process -id $process.Id

Завершение

Командлет Start-Process отлично подходит для запуска одного или нескольких приложений или скриптов из PowerShell. К сожалению, мы не можем легко захватить вывод процесса, но с небольшим обходным путем мы все же можем проанализировать результаты в PowerShell.

Надеюсь, вы нашли эту статью полезной. Если у вас есть вопросы, просто оставьте комментарий ниже.