1

PowerShell で関数またはスクリプト ブロックを実行し、実行のタイムアウトを設定しようとしています。

基本的に私は以下を持っています(疑似コードに翻訳されています):

function query{
    #query remote system for something
}

$computerList = Get-Content "C:\scripts\computers.txt"

foreach ($computer in $computerList){
    $result = query
    #do something with $result
}

クエリは、Get-WmiObject を使用した WMI クエリから HTTP 要求にまで及ぶ可能性があり、スクリプトは混合環境で実行する必要があります。これには、HTTP インターフェイスを備えていない Windows マシンと Unix マシンが含まれます。したがって、一部のクエリは必然的にハングするか、返されるまでに非常に長い時間がかかります。最適化の探求において、私は次のように書いています。

$blockofcode = {
    #query remote system for something
}

foreach ($computer in $computerList){
    $Job = Start-Job -ScriptBlock $blockofcode -ArgumentList $computer
    Wait-Job $Job.ID -Timeout 10 | out-null
    $result = Receive-Job $Job.ID
    #do something with result
}

しかし、残念ながら、ジョブには多くのオーバーヘッドがかかるようです。私のテストでは、($blockofcode 内のタイマーによると) 1.066 秒で実行されるクエリは、ジョブとして実行された場合、結果を返すのに 6.964 秒かかりました。もちろん機能しますが、そのオーバーヘッドを減らしたいと思っています。また、すべてのジョブをまとめて開始し、それらが終了するのを待つこともできますが、それでもジョブがハングしたり、完了までに途方もない時間がかかったりする可能性があります。

それでは、質問に移りましょう: ステートメント、関数、スクリプトブロック、またはジョブに伴うオーバーヘッドの種類を含まないタイムアウトでスクリプトを実行する方法はありますか? 可能であれば、コマンドを並行して実行したいのですが、それは契約を破るものではありません。

どんな助けやヒントも大歓迎です!

編集: windows/unix が混在する環境で powershell V3 を実行する

4

2 に答える 2

1

Powershell 実行空間を使用して調査することをお勧めします。

http://learn-powershell.net/2012/05/13/using-background-runspaces-instead-of-psjobs-for-better-performance/

于 2013-11-08T11:35:45.243 に答える