3

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

$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

与其使用作业,不如使用 cmdlet 中内置的查询多台计算机的功能。Microsoft 的许多 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 版本来测试上述内容并检查输出,但这是一个起点。

于 2013-03-28T01:33:23.470 回答
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 回答