Поиск в хэш-таблице RunSpacePool

Я собираю сценарий powershell, который будет использовать RunSpacePools для вывода CSV-файла, содержащего 1) имя сервера, 2) окно обслуживания SCCM, 3) PingCheck, 4) LastRebootTimestamp.

У меня есть что-то работающее, используя этот замечательный ответ, но в моем CSV-файле есть пустые строки, и я не могу загрузить окно обслуживания SCCM в CSV.

Я не знаю, как завершить поиск в окне обслуживания SCCM, а затем добавить его к выходным данным $Job.Result, или я могу просто добавить его в $ScriptBlock и позволить RunSpacePool очень быстро завершить поиск.

Пустая строка CSV — ,,, а в некоторых строках нет дополнительной пустой строки.

-edit, теперь я думаю выполнить поиск в окне SCCM, а затем просто передать его в runspacepool в качестве еще одного параметра/аргумента.

    IF(Get-Command Get-SCOMAlert -ErrorAction SilentlyContinue){}ELSE{Import-Module OperationsManager}

    "Get Pend reboot servers from prod"
New-SCOMManagementGroupConnection -ComputerName ProdSCOMServer

$AlertData = get-SCOMAlert -Criteria "Severity = 1 AND ResolutionState < 254 AND Name = 'Pending Reboot detected on the ConfigMgr 2012 Client'" | Select NetbiosComputerName

    "Get Pend reboot servers from test"
#For test information
New-SCOMManagementGroupConnection -ComputerName TestSCOMServer

$AlertData += Get-SCOMAlert -Criteria "Severity = 1 AND ResolutionState < 254 AND Name = 'Pending Reboot detected on the ConfigMgr 2012 Client'" | Select NetbiosComputerName

    "Remove duplicates"
$AlertDataNoDupe = $AlertData | Sort NetbiosComputerName -Unique

$Global:table = @{}
    "Populate hash table"

$MaintenanceWindow = Import-Csv D:\Scripts\MaintenanceWindow2.csv

$MaintenanceWindow | ForEach-Object {$Global:table[$_.Computername] = $_.CollectionName}

$scriptblock = {
 Param([string]$server)

#Try getting SCCM Maintenance Window
$SCCMWindow = IF($Global:table.ContainsKey($server)){
                $SCCMWindow = $table[$server]
                } Else { $SCCMWindow = "Not Found!"}

 $PingCheck = Test-Connection -Count 1 $server -Quiet -ErrorAction SilentlyContinue
        IF($PingCheck){$PingResults = "Alive"}
        ELSE{$PingResults = "Dead"}

 Try{$operatingSystem = Get-WmiObject Win32_OperatingSystem -ComputerName $server -ErrorAction Stop
        $LastReboot = [Management.ManagementDateTimeConverter]::ToDateTime($operatingSystem.LastBootUpTime)
        $LastReboot.DateTime}
        Catch{$LastReboot = "Access Denied!"}

 [PSCustomObject]@{

 Server=$server
 Ping=$PingResults
 LastReboot=$LastReboot
 }#end custom object
}#script block end

$RunspacePool = [RunspaceFactory]::CreateRunspacePool(100,100)
$RunspacePool.Open()
$Jobs = 
 foreach ( $item in $AlertDataNoDupe )
 {
 $Job = [powershell]::Create().
        AddScript($ScriptBlock).
        AddArgument($item.NetbiosComputerName)
 $Job.RunspacePool = $RunspacePool

 [PSCustomObject]@{
  Pipe = $Job
  Result = $Job.BeginInvoke()
 }
}

Write-Host 'Working..' -NoNewline

 Do {
  Write-Host '.' -NoNewline
  Start-Sleep -Seconds 1
} While ( $Jobs.Result.IsCompleted -contains $false)

Write-Host ' Done! Writing output file.'
Write-host "Output file is d:\scripts\runspacetest5.csv"

$(ForEach ($Job in $Jobs)
{ $Job.Pipe.EndInvoke($Job.Result) }) |
 Export-Csv d:\scripts\runspacetest5.csv -NoTypeInformation

$RunspacePool.Close()
$RunspacePool.Dispose()

person user4317867    schedule 13.03.2016    source источник
comment
С RunspacePool может быть лучше использовать синхронизированную хеш-таблицу $Global:table = [hashtable]::Synchronized(@{}), это предотвратит конфликты доступа при одновременном выполнении нескольких заданий.   -  person Jan Chrbolka    schedule 15.03.2016
comment
Я пытаюсь заставить это работать, но все идет не по-моему.   -  person user4317867    schedule 18.03.2016
comment
В итоге мы использовали этот подход, взяв ответ здесь и используя оператор IF, но теперь некоторые результаты System.Object[], которые, как я полагаю, являются результатом двойного присутствия в списке/CSV.   -  person user4317867    schedule 18.03.2016


Ответы (1)


Не уверен, что это лучший способ, но в итоге я использовал следующее, что представляет проблему в случае, если в MaintenanceWindow2.csv есть две записи, потому что он возвращает System.Object[]

$scriptblock = {
 Param([string]$server)

 $csv = Import-Csv D:\Scripts\MaintenanceWindow2.csv
 $window = $csv | where {$_.Computername -eq "$server"} | % CollectionName
 $SCCMWindow = IF ($window){$window}ELSE{"NoDeadline"}
}
person user4317867    schedule 19.03.2016