6

バックアップ操作の一環として、7zip コマンドを実行してフォルダーを単一の .7z ファイルに圧縮しています。を使用しているので問題ありませんInVoke-WMIMethod

例:

$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 to nudge by @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)
4

2 に答える 2

5

Invoke-Command コマンドレットを使用して、リモート コンピューターで Wait-Process コマンドレットを呼び出すことができます。例:

$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

Invoke-Command の使用はオプションではないと述べたので、別のオプションはポーリングです。例:

$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"
于 2013-08-20T19:00:55.130 に答える
0

プロセスが終了するまでスリープする do... while ループでそれを実行できるはずです。

 do { 
    "waiting"
    start-sleep 10 
    } while (gwmi -class win32_process -ComputerName $remotehost | Where ProcessName -eq "7za.exe")
于 2013-08-20T18:27:41.557 に答える