2013-08-20 26 views
5

Là một phần của hoạt động sao lưu, tôi đang chạy lệnh 7zip để nén một thư mục thành một tệp .7z. Không có vấn đề gì khi tôi đang sử dụng InVoke-WMIMethod.Powershell - Kiểm tra quá trình từ xa, nếu thực hiện tiếp tục

Ví dụ:

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

Vấn đề của tôi đến trong như kịch bản của tôi tiếp tục, quá trình 7za.exe chưa hoàn tất. Sau đó tôi cố gắng sao chép mục đó ra khỏi hệ thống từ xa và nó không đầy đủ hoặc không thành công.

Ai đó có thể chỉ cho tôi theo hướng để tìm hiểu cách xác định xem quy trình 7za.exe có đang chạy hay không, đợi cho đến khi nó chết, sau đó tiếp tục với phần còn lại của tập lệnh của tôi?

tôi có thể nắm kéo quá trình từ hệ thống từ xa thông qua ...

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

Không chắc làm thế nào để biến chúng thành thông tin có thể sử dụng cho vấn đề của tôi.

trả lời UPDATE: (thx để di chuyển bởi @dugas)

này sẽ làm điều đó với một số thông tin phản hồi cho những người cần nó ...

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) 

Trả lời

3

Bạn có thể gọi lệnh ghép ngắn quá trình chờ trên máy tính từ xa bằng lệnh ghép ngắn Invoke-Command. Ví dụ:

$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 

Vì bạn đã đề cập bằng cách sử dụng Gọi-lệnh không phải là một tùy chọn, một tùy chọn khác là bỏ phiếu. Ví dụ:

$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

Tôi đã xem Invoke-Command, tuy nhiên tại thời điểm này, việc sử dụng winrm không phải là một lựa chọn cho tôi trên các hệ thống từ xa. Hy vọng trong tương lai nó sẽ. Tôi xin lỗi tôi không bao gồm thông tin đó ... – c3uba9wfaq

+0

Đã cập nhật câu trả lời. – dugas

+0

Được rồi, tôi cho bạn tín dụng .. bạn đã cho tôi đi đúng hướng. Một lần nữa .. Tôi Get-Process không hoạt động trong trường hợp này, nhưng tôi đã tìm thấy bằng cách sử dụng Get-WMIObject làm việc độc đáo. do {(Write-Host "Waitng ..."), (Start-Sleep -Seconds 5)} cho đến ((Get-WMIobject -Class Win32_process -ComputerName $ target | trong đó {$ _. Name -eq "7za.exe "}). ProcessID -eq $ null) – c3uba9wfaq

0

Bạn sẽ có thể để làm điều đó với vòng lặp do ... while chỉ ngủ cho đến khi quá trình kết thúc.

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

Lưu ý rằng một vấn đề với việc này là bạn có thể đang chờ quá trình bạn chưa bắt đầu. Một vấn đề khác có thể là hiệu quả, để kiểm tra tình trạng trong khi bạn phải lặp lại tất cả các đối tượng được trả về. Ngoài ra, cú pháp trên không chính xác và sẽ không thực thi. – dugas

Các vấn đề liên quan