2013-08-20 20 views
5

Come parte di un'operazione di backup, eseguo il comando 7zip per comprimere una cartella in un singolo file .7z. Nessun problema lì mentre sto usando il InVoke-WMIMethod.PowerShell - Controllo del processo remoto, se terminato

Esempio:

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

Il mio problema arriva come mio script continua, il processo 7za.exe non è stato completato. Sto quindi tentando di copiare l'elemento dal sistema remoto ed è incompleto o fallisce.

Qualcuno può indicarmi la direzione per capire come identificare se il processo 7za.exe è ancora in esecuzione, attendere fino a quando non è morto, quindi procedere con il resto del mio script?

posso cogliere tirando il processo dal sistema remoto tramite ...

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

Non sai come trasformarla in informazioni utilizzabili per il mio problema.

risposta UPDATE: (thx per spingere da @dugas)

Questo lo farà con un feedback per coloro che ne hanno bisogno ...

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) 

risposta

3

È possibile richiamare il cmdlet Wait-Process sul computer remoto con il cmdlet Invoke-Command. Esempio:

$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 

Dal momento che lei ha citato utilizza Invoke-Command non è un'opzione, un'altra opzione è polling. Esempio:

$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

Ho dato un'occhiata a Invoke-Command, tuttavia a questo punto l'utilizzo di winrm non è un'opzione per me sui sistemi remoti. Sperando in futuro lo farà. Mi scuso per non aver incluso questa informazione ... – c3uba9wfaq

+0

Risposta aggiornata. – dugas

+0

Va bene, ti sto dando credito ... mi hai messo sulla buona strada. Anche in questo caso ... Get-Process non funziona in questo caso, ma ho trovato che usare Get-WMIObject funzionava bene. do {(Write-Host "Waitng ..."), (Start-Sleep -Seconds 5)} until ((Get-WMIobject -Class Win32_process -ComputerName $ target | dove {$ _. Nome -eq "7za.exe "}). ProcessID -eq $ null) – c3uba9wfaq

0

Si dovrebbe essere in grado di farlo con un ciclo do ... while che dorme solo fino al termine del processo.

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

Si noti che un problema con questo è che si può essere in attesa di un processo che non è stato avviato. Un altro problema potrebbe essere l'efficienza, in quanto per verificare la condizione while è necessario iterare tutti gli oggetti restituiti. Inoltre, la sintassi precedente non è corretta e non verrebbe eseguita. – dugas

Problemi correlati