Остановите и затем запустите процесс в powershell - PullRequest
4 голосов
/ 23 февраля 2011

Я хотел бы остановить / убить определенный процесс и затем запустить его снова после того, как я закончу делать то, что должен.

Это то, что у меня уже есть.

Clear-host
$processes = Get-Process devenv 
$processes.Count
if($processes.Count -gt 1)
{
    $i = 0
    Write-host "There are multiple processes for devenv."
    foreach($process in $processes)
    {
        $i++
        $i.ToString() + '. ' + $process.MainWindowTitle
    }
    $in = Read-host "Give a number of the process to kill: "
    write-host
    write-host "killing and restarting: " + $processes[$in-1].MainWindowTitle
    $processes[$in-1].Kill()
    $processes[$in-1].WaitForExit()
    $processes[$in-1].Start()

}
else
{
    write-host "something else"
}

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

1 Ответ

5 голосов
/ 23 февраля 2011

$processes[$in-1].Start() не будет работать.Вам нужно захватить информацию о процессах, которую вы убиваете, и снова запустить то же приложение.Вы можете получить двоичные данные процесса и информацию о командной строке, используя класс WMI Win32_Process.

Например,

Clear-host
$processes = Get-Process notepad 
$processes.Count
if($processes.Count -gt 1)
{
    $i = 0
    Write-host "There are multiple processes for notepad."
    foreach($process in $processes)
    {
        $i++
        $i.ToString() + '. ' + $process.MainWindowTitle
    }
    $in = Read-host "Give a number of the process to kill: "
    write-host
    write-host "killing and restarting: " + $processes[$in-1].MainWindowTitle

    #Get the process details
    $procID = $processes[$in-1].Id
    $cmdline = (Get-WMIObject Win32_Process -Filter "Handle=$procID").CommandLine
    $processes[$in-1].Kill()
    $processes[$in-1].WaitForExit()
}

В приведенном выше примере я использую WMI для получения информации командной строки для выбранного процесса.Если бы это был процесс блокнота с каким-нибудь открытым текстовым файлом, командная строка для этого процесса выглядела бы как "C:\WINDOWS\system32\NOTEPAD.EXE" C:\Users\ravikanth_chaganti\Desktop\debug.log

Теперь все, что вам нужно сделать, это: Как-нибудь вызвать эту командную строку (эта часть отсутствует в примереЯ написал).Очень грубый способ сделать это:

Start-Process -FilePath $cmdline.Split(' ')[0] -ArgumentList $cmdline.Split(' ')[1]

Но, в вашем случае, может не быть никакого списка аргументов.

Надеюсь, это даст вам идею.У других экспертов PowerShell может быть другой и эффективный подход.Это просто быстрый взлом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...