start-job并行运行命令,并在它们到达时输出结果



我试图在服务器列表上获得特定的KBXXXXXX存在,但是一旦我的脚本一个服务器需要时间并返回结果并返回,然后移动到下一个。这个脚本对我来说工作得很好。我希望我的脚本启动和get-hotfix作为作业和其他过程,只是为了收集结果并显示它们。

$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
    } 
}

目标是使列表执行得更快,而不是连续运行。

使用Powershell V2,您可以使用@Andy answer中的作业,或者在此链接中进一步详细说明Powershell可以并行运行命令吗?

对于PowerShell V2,您可能还想使用runspaces查看此脚本http://gallery.technet.microsoft.com/scriptcenter/Foreach-Parallel-Parallel-a8f3d22b

在PowerShell V3中,您有foreach -parallel选项。

例如

(注意Measure-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 }

使用PowerShell作业。

cmdlets:

  • 求职
  • 接受职业
  • Remove-Job
  • 启动作业
  • Stop-Job
  • Wait-Job

下面是一个未测试的例子:

$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

不使用作业,而是使用cmdlet内置的查询多台计算机的功能。许多微软的cmdlet,特别是那些用于系统管理的cmdlet,接受一个字符串数组作为-Computername参数的输入。传入服务器列表,cmdlet将查询所有服务器。大多数具有此功能的cmdlet将串联查询服务器,但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版本来测试上面的&检查输出,但这是一个起点。

相关内容

  • 没有找到相关文章

最新更新