2011-02-23 81 views
3

我想停止/終止某個進程,然後在完成我必須做的事情之後再次啓動它。停止然後在powershell中啓動一個進程

這就是我已經擁有的。

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" 
} 

但是,開始需要一些參數,我認爲我可以從過程中獲得。但我不確定我知道該給它什麼。

回答

4

$processes[$in-1].Start()不起作用。您需要捕獲正在查殺的processinfo並再次啓動相同的應用程序。您可以使用Win32_Process WMI類獲取進程二進制和命令行信息。

例如,

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專家可能有不同的高效方法。這只是一個快速入侵。

+0

我一直在嘗試這個,但win7/64x似乎不知道win32_process類,無論我告訴它。 – chrissie1 2011-02-24 09:31:15

+0

嗯..我寫了/在Win7 x64系統上試過這個例子。你究竟做了什麼? – ravikanth 2011-02-24 10:53:49

+0

我嘗試exatcly你所訂購的,並得到一個無效的類異常,當我做get-wmiobject -list我沒有看到它的win32_process,我運行powershell ISE作爲管理員,這也沒有幫助。 GRR。 – chrissie1 2011-02-24 11:03:51