3

サーバーのリストで特定の KBXXXXXX の存在を取得しようとしていますが、1 つのサーバーをスクリプトすると時間がかかり、結果が返されて戻ってきて、次のサーバーに移動します。このスクリプトは私にとっては問題なく動作します。結果を収集して表示するためだけに、スクリプトを開始して、ジョブやその他のプロセスとしてホットフィックスを取得したいと考えています。

$servers = gc .\list.txt 
foreach ($server in $servers) 
{ 
    $isPatched = (Get-HotFix -ComputerName $server | where HotFixID -eq 'KBxxxxxxx') -ne $null 
    If ($isPatched) 
    { 
    write-host $server + "Exist">> .\patchlist.txt} 
    Else  
    { 
    Write-host $server +"Missing"
$server  >> C:\output.txt
    } 

}

リストを順次実行するのではなく、より高速に実行することを目的としています。

4

3 に答える 3

4

Powershell V2 では、@Andy の回答のようにジョブを使用できます。また、このリンクのCan Powershell Run Commands in Parallel? の詳細についても説明しています。

PowerShell V2 では、実行空間を使用してこのスクリプトhttp://gallery.technet.microsoft.com/scriptcenter/Foreach-Parallel-Parallel-a8f3d22bを確認することもできます。

PowerShell V3 にはforeach -parallelオプションがあります。

例(NBMeasure-Commandはタイミングのためだけにあるので、比較できます)

Workflow Test-My-WF {  
  param([string[]]$servers)

  foreach -parallel ($server in $servers) {

    $isPatched = (Get-HotFix -ComputerName $server | where {$_.HotFixID -eq 'KB9s82018'}) -ne $null     
    If ($isPatched) 
    { 
        $server | Out-File -FilePath "c:\temp\_patchlist.txt" -Append
    } 
    Else  
    { 
        $server | Out-File -FilePath "c:\temp\_output.txt" -Append 
    } 
  }
}

Measure-Command -Expression { Test-My-WF   $servers }
于 2013-03-28T01:21:58.850 に答える
0

これには、PowerShell ジョブを使用します。

コマンドレット:

  • ゲットジョブ
  • 受信ジョブ
  • 削除ジョブ
  • ジョブ開始
  • ストップジョブ
  • 待機ジョブ

テストされていない例を次に示します。

$check_hotfix = {
    param ($server)
    $is_patched = (Get-HotFix -ID 'KBxxxxxxx' -ComputerName $server) -ne $null 
    if ($is_patched) { 
        Write-Output ($server + " Exist") 
    } else { 
        Write-Output ($server + " Missing")
    }
}

foreach ($server in $servers) {
    Start-Job -ScriptBlock $check_hotfix -ArgumentList $server | Out-Null
}

Get-Job | Wait-Job | Receive-Job | Set-Content patchlist.txt
于 2013-03-28T00:40:21.977 に答える
0

ジョブを使用するのではなく、コマンドレットに組み込まれている複数のコンピューターに対してクエリを実行する機能を使用します。Microsoft のコマンドレットの多く、特にシステム管理に使用されるコマンドレットは、-Computernameパラメーターの入力として文字列の配列を取ります。サーバーのリストを渡すと、コマンドレットはそれらすべてにクエリを実行します。この機能を備えたコマンドレットのほとんどは、サーバーに対して順次クエリを実行しますがInvoke-Command、並行して実行します。

現時点では Windows を起動していないため、これをテストしていませんが、これで (順番に) 開始できるはずです。

$servers = gc .\list.txt 
$patchedServers = Get-HotFix -ComputerName $servers | where HotFixID -eq 'KBxxxxxxx'|select machinename

$unpatchedServers = compare-object -referenceobject $patchedServers -differenceobject $servers -PassThru

$unpatchedServers |out-file c:\missing.txt;
$patchedServers|out-file c:\patched.txt;

並行して:

$servers = gc .\list.txt 
$patchedServers = invoke-command -computername $servers -scriptblock {Get-HotFix | where HotFixID -eq 'KBxxxxxxx'}|select -expandproperty pscomputername |sort -unique

以前と同様に、現時点で上記をテストして出力を確認するための適切なバージョンの Windows を利用できませんが、これは出発点です。

于 2013-03-28T01:33:23.470 に答える