Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Powershell - Check on Remote Process, if done continue

Tags:

powershell

As part of a backup operation, I am running the 7zip command to compress a folder into a single .7z file. No problems there as I am using the InVoke-WMIMethod.

Example:

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

My problem comes in as my script continues, the 7za.exe process hasn't completed. I am then attempting to copy the item off of the remote system and it is either incomplete or fails.

Can someone point me in the direction to figure out how to identify if the 7za.exe process is still running, wait until it is dead, then proceed with the rest of my script?

I can grasp pulling the process from the remote system via...

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

Not sure how to turn that into usable info for my issue.

Answer UPDATE: (thx to nudge by @dugas)

This will do it with some feedback for those that need it...

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)
like image 938
c3uba9wfaq Avatar asked Aug 20 '13 17:08

c3uba9wfaq


1 Answers

You can invoke the Wait-Process cmdlet on the remote computer with the Invoke-Command cmdlet. Example:

$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

Since you mentioned using Invoke-Command is not an option, another option is polling. Example:

$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"
like image 117
dugas Avatar answered Oct 23 '22 17:10

dugas