2013-03-27 3 views
2

Я пытаюсь получить конкретное существование KBXXXXXX в списке серверов, но как только мой скрипт на одном сервере занимает время и возвращает результат и возвращается, а затем переходит к следующему один . этот скрипт отлично работает для меня. Я хочу, чтобы мой скрипт запускался и получал исправление как работу и другой процесс, чтобы собирать результаты и отображать их.start-job Запуск команды в параллельном и выходном результате по мере их поступления

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

} 

Целью, чтобы список выполнялся быстрее, а не серийный.

+0

Посмотрите на аналогичный вопрос http://stackoverflow.com/questions/15580105/powershell-run-multiple-jobs-in-parralel-and-view-streaming-results-from-backgr –

ответ

0

Для этого используйте рабочие места PowerShell.

командлеты:

  • Get-Job
  • Receive-Job
  • Remove-Job
  • Start-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 
3

С 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.

, например (NB 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 } 
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, доступная в данный момент, чтобы проверить выше & проверить выходные, но это отправная точка.

+0

@alroc thats interesting , вы можете ссылаться на некоторые онлайн-статьи по этому типу параллельной обработки. Спасибо –

+0

@PaulRowland, к сожалению, мне трудно найти хорошую документацию о том, как это работает.Посмотрите справочную информацию по ['Get-Hotfix'] (http://technet.microsoft.com/en-us/library/hh849836.aspx) и [первые несколько хитов здесь] (https: // www. google.com/search?q=powershell+computername+parameter+site:microsoft.com). Рабочие места хороши, когда они вам нужны, но они могут ввести излишнюю сложность. Используйте то, что предоставляет PowerShell - MS, вероятно, сделала параллелизм лучше, чем вы. – alroc

+0

@alroc - спасибо за это, но я не видел, где он предлагает сделать это параллельно. Было бы также интересно узнать, совпадает ли это с обложками с использованием опции foreach -parallel. У меня сейчас нет тестовых серверов, но я могу запустить скрипт для сравнения двух. –

Смежные вопросы