2013-08-20 8 views
5

एक बैकअप आपरेशन के हिस्से के रूप में, मैं 7zip आदेश चला रहा हूँ एक भी .7z फ़ाइल में एक फ़ोल्डर संपीड़ित करने के लिए जारी है। वहां कोई समस्या नहीं है क्योंकि मैं InVoke-WMIMethod का उपयोग कर रहा हूं।Powershell - रिमोट प्रक्रिया पर चेक, अगर किया

उदाहरण:

$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 के साथ प्रतीक्षा-प्रक्रिया 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 

चूंकि आपने इनवोक-कमांड का उपयोग करने का उल्लेख किया है, एक विकल्प नहीं है, दूसरा विकल्प मतदान है। उदाहरण:

$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

ठीक है मैं तुम्हें दे रहा हूँ credit..you मुझे सही रास्ते पर मिला है। दोबारा .. मैं इस मामले में गेट-प्रोसेस काम नहीं करता, लेकिन मुझे गेट-डब्लूएमआईओब्जेक्ट का उपयोग करके अच्छी तरह से काम किया गया। करें {(लिखें-होस्ट "प्रतीक्षा करें ..."), (स्टार्ट-स्लीप-सेकेंड 5)} तक ((Get-WMIobject -Class Win32_process -ComputerName $ target | जहां {$ _। नाम -eq "7za.exe "})। ProcessID -eq $ null) – c3uba9wfaq

0

आप यह करने के लिए सक्षम होना चाहिए एक काम के साथ ... जबकि लूप जो प्रक्रिया समाप्त होने तक बस सोता है।

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

ध्यान दें कि ऐसा करने के साथ एक मुद्दा यह है कि आप उस प्रक्रिया पर इंतजार कर रहे हैं जिस पर आपने शुरू नहीं किया था। एक और मुद्दा दक्षता हो सकता है, क्योंकि उस स्थिति को जांचने के लिए आपको लौटाई गई सभी वस्तुओं को फिर से चालू करना होगा। साथ ही, उपर्युक्त वाक्यविन्यास गलत है और निष्पादित नहीं होगा। – dugas

संबंधित मुद्दे