2013-08-20 41 views
5

作爲備份操作的一部分,我正在運行7zip命令將文件夾壓縮到單個.7z文件中。沒有問題,因爲我正在使用InVoke-WMIMethodPowershell - 檢查遠程過程,如果已完成

例子:

$zip = "cmd /c $irFolder\7za.exe a $somedirectory.7z $somedirectory" 
"InVoke-WmiMethod -class Win32_process -name Create -ArgumentList $zip -ComputerName $remotehost" 

我的問題就會出現,我的劇本還在繼續,7za.exe進程尚未完成。然後,我試圖將該項目從遠程系統複製出來,並且不完整或失敗。

有人可以指示我如何確定7za.exe進程是否仍在運行,等到它死了,然後繼續執行我的其餘腳本?

我可以把握通過拉動過程中從遠程系統...

get-wmiobject -class Win32_Process -ComputerName $remotehost | Where-Object $_.ProcessName -eq "7za.exe"} 

不知道如何將其轉換成我的問題可用的信息。

答案更新:(THX由@dugas輕移)

這將與那些需要它的一些反饋做...

do {(Write-Host "Waiting..."),(Start-Sleep -Seconds 5)} 
until ((Get-WMIobject -Class Win32_process -Filter "Name='7za.exe'" -ComputerName $target | where {$_.Name -eq "7za.exe"}).ProcessID -eq $null) 

回答

3

您可以使用Invoke-Command cmdlet調用遠程計算機上的Wait-Process cmdlet。例如:

$process = Invoke-WmiMethod -Class Win32_Process -Name create -ArgumentList notepad -ComputerName RemoteComputer 

Invoke-Command -ComputerName RemoteComputer -ScriptBlock { param($processId) Wait-Process -ProcessId $processId } -ArgumentList $process.ProcessId 

由於您提到使用Invoke-Command不是選項,所以另一個選項是輪詢。 例如:

$process = Invoke-WmiMethod -Class Win32_Process -Name create -ArgumentList notepad -ComputerName hgodasvccr01 
$processId = $process.ProcessId 

$runningCheck = { Get-WmiObject -Class Win32_Process -Filter "ProcessId='$processId'" -ComputerName hgodasvccr01 -ErrorAction SilentlyContinue | ? { ($_.ProcessName -eq 'notepad.exe') } } 

while ($null -ne (& $runningCheck)) 
{ 
Start-Sleep -m 250 
} 

Write-Host "Process: $processId is not longer running" 
+0

我看過Invoke-Command,但是在這一點上,利用winrm不是我在遠程系統上的一種選擇。希望在未來它會。我很抱歉,我沒有包含該信息... – c3uba9wfaq

+0

已更新的答案。 – dugas

+0

好吧我給你信用..你讓我走在正確的軌道上。再次..我Get-Process在這種情況下不起作用,但我確實發現使用Get-WMIObject可以很好地工作。 ((Get-WMIobject -Class Win32_process -ComputerName $ target | where {$ _。Name -eq「7za.exe){(Write-Host」Waitng ...「),(Start-Sleep -Seconds 5)} 「})。ProcessID -eq $ null) – c3uba9wfaq

0

你應該能夠做到這一點用一個do ... while循環,直到該過程完成纔會休眠。

do { 
    "waiting" 
    start-sleep 10 
    } while (gwmi -class win32_process -ComputerName $remotehost | Where ProcessName -eq "7za.exe") 
+1

請注意,這樣做的一個問題是您可能正在等待您沒有啓動的進程。另一個問題可能是效率問題,因爲要檢查while條件,必須迭代所有返回的對象。另外,上面的語法不正確,不會執行。 – dugas