2013-08-20 10 views
5

W ramach operacji tworzenia kopii zapasowej uruchomię polecenie 7zip, aby skompresować folder do pojedynczego pliku .7z. Żadnych problemów, ponieważ używam InVoke-WMIMethod.Powershell - Sprawdź proces zdalny, jeśli to zrobisz, kontynuuj

Przykład:

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

Mój problem jest w jak mój skrypt kontynuuje proces 7za.exe nie została zakończona. Próbuję następnie skopiować element z systemu zdalnego i jest on niekompletny lub kończy się niepowodzeniem.

Czy ktoś może wskazać mi kierunek, aby dowiedzieć się, jak rozpoznać, czy proces 7za.exe nadal działa, czekać do jego śmierci, a następnie przystąpić do reszty mojego skryptu?

mogę pojąć ciągnąc proces z systemu zdalnego poprzez ...

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

Nie wiem, jak to zmienić w użyteczną informacją o mojej sprawie.

Odpowiedź UPDATE: (thx, by odwieść przez @dugas)

Będzie to zrobić to z pewnym sprzężeniem zwrotnym dla tych, którzy jej potrzebują ...

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) 

Odpowiedz

3

Możesz wywołać polecenie cmdlet Wait-Process na komputerze zdalnym za pomocą polecenia cmdlet Invoke-Command. Przykład:

$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 

Ponieważ wspomniano o użyciu polecenia Invoke-Command nie jest opcją, inną opcją jest pobieranie. Przykład:

$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

Zerknąłem na Invoke-Command, jednak w tym momencie wykorzystanie WinRM nie jest dla mnie opcją na zdalnych systemach. Mając nadzieję, że w przyszłości to nastąpi. Przepraszam, że nie uwzględniłem tych informacji ... – c3uba9wfaq

+0

Zaktualizowana odpowiedź. – dugas

+0

Dobrze, że daję ci kredyt .. masz mnie na dobrej drodze. Ponownie ... Get-Process nie działa w tym przypadku, ale zauważyłem, że używanie Get-WMIObject działało dobrze. do {(Write-Host "Waitng ..."), (Start-Sleep -Seconds 5)} do ((Get-WMIobject -Class Win32_process -KomputerName $ target | gdzie {$ _. Name -eq "7za.exe "}). ProcessID -eq $ null) – c3uba9wfaq

0

Powinieneś być w stanie to zrobić z pętlą do ... while, która po prostu śpi, aż proces się zakończy.

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

Należy zauważyć, że jedną z kwestii związanych z tym problemem może być czekanie na proces, który nie został uruchomiony. Kolejną kwestią może być wydajność, ponieważ aby sprawdzić warunek while, musisz powtórzyć wszystkie zwrócone obiekty. Również powyższa składnia jest niepoprawna i nie zostałaby wykonana. – dugas

Powiązane problemy