我試圖用作業均PowerShell中運行的併發實例,讓我的腳本可以更快地完成。我打電話的腳本都是獨立的,不需要互斥等。問題是它會調用50個腳本中的5個,然後停止。其餘的腳本似乎永遠不會運行。等待工作有什麼問題?也由於某種原因實際運行五個腳本似乎讓我得到雙重輸出要執行兩次......並非所有我的PowerShell v2的工作得到運行
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
$ScriptDir = Split-Path $Invocation.MyCommand
$ScriptDir -match '(?<content>.*\d)' | out-null
$MainDir = $matches['content']
$ScriptName = $MyInvocation.MyCommand.Name
$Items = Get-ChildItem -Path $MainDir | Where-Object {$_.mode -match "d"}
$jobMax = 4
$jobs = @()
$jobWork = {
param ($MyInput,$dir)
$command = "$dir\" + $MyInput.name + "\" + $MyInput.name + ".ps1"
Start-Process powershell.exe -argumentlist $command -WindowStyle Hidden #-wait
}
foreach ($Item in $Items) {
if ($jobs.Count -le $jobMax) {
$jobs += Start-Job -ScriptBlock $jobWork -ArgumentList $Item,$MainDir
} else {
$jobs | Wait-Job -Any
}
}
$jobs | Wait-Job
編輯:此外,由於我使用的啓動過程PowerShell中的所有腳本同時運行(除非我啓用 - 等待),而不需要開始工作。我想用工作,這樣我就可以加油了。也許這是錯誤的邏輯,我有一份工作開始一個新的PowerShell實例?
EDIT2:我認爲這是錯誤的使用開始作業開始poweshell的新實例。在打開新的PowerShell實例後完成這項工作,實際的腳本內容與作業的開始和結束無關。這裏是我的固定腳本:)
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
$ScriptDir = Split-Path $Invocation.MyCommand
$ScriptDir -match '(?<content>.*\d)' | out-null
$MainDir = $matches['content']
$ScriptName = $MyInvocation.MyCommand.Name
$Items = Get-ChildItem -Path $MainDir | Where-Object {$_.mode -match "d"}
$maxJobs = 4
$jobs = @()
foreach ($Item in $Items) {
$command = "$MainDir\" + $Item.name + "\" + $Item.name + ".ps1"
$jobs += Start-Job -filepath $command -ArgumentList $MainDir,$Item
$running = @($jobs | ? {$_.State -eq 'Running'})
while ($running.Count -ge $maxJobs) {
$finished = Wait-Job -Job $jobs -Any
$running = @($jobs | ? {$_.State -eq 'Running'})
}
}
Wait-Job -Job $jobs > $null
我不得不編輯所有我的腳本,以便我可以傳遞參數作爲參數,但現在一切工作正常。這個線程是有益的Running multiple scriptblocks at the same time with Start-Job (instead of looping)
感謝您的回覆。看我的編輯。接收/刪除作業似乎不是問題。但是關於-file參數的最後一個註釋更接近了一點,並幫助我朝着解決此問題的正確方向前進。謝謝。 – kokotas