簡體   English   中英

從多個PowerShell線程收集和轉換輸出的最佳方法是什么?

[英]What is the best way to collect and transform output from multiple PowerShell threads?

我是PowerShell腳本的新手,並希望執行以下操作:

  1. 給定配置名稱和服務器的列表,請從每個服務器返回配置的值。

  2. 轉換它們的方式是按配置名稱而不是服務器將其分組。

當前,我有一個腳本,該腳本在每個服務器上產生一個作業,並在服務器上遠程調用腳本以返回該服務器的配置列表。

但是,我不知道如何聚合和轉換這些作業的輸出,因此我不想先按服務器獲取配置名稱,而是先按配置名稱對它們進行排序,然后對服務器進行排序。

電流輸出:

Server1: 
Config1 = 'abc'
Config2 = 'def'

Server2: 
Config1 = 'xyz'
Config2 = '123'

所需的輸出:

Config1: 
Server1 : 'abc'
Server2 : 'xyz'

Config2:
Server1 : 'def'
Server2 : '123'

我不想遍歷配置名稱,因為那樣會浪費時間為每個調用連接到服務器。 因此,我想遍歷服務器並進行某種轉換。

我想知道是否要讓每個作業返回某種字典,然后在所有線程完成轉換之后在它們上進行迭代?

這是調用作業的代碼:

$all_servers = @('server1', 'server2')
$config_names = @('config1', 'config2')

foreach($servername in $all_servers) {
    Start-Job -FilePath C:\scripts\get_config_from_servers.ps1 
              -ArgumentList $servername,$config_names
}

Get-Job | Wait-Job
Get-Job | Receive-Job | Out-GridView

這是作業腳本:

Param($servername,$config_names)

$session = Get-Session -computername $servername 
                       -username $$$$
                       -pwd ####
try {
        $sb = {
                param($servername,$config_names)

                $output = @{}
                    foreach ($cfg in $config_names) {
                        $config_value = Get-Config -configname $cfg
                        $output.Add("$servername : $cfg", "($config_value)")
                    }
                write-host $output | Out-String
                return $output | Out-String
        }
        $out = Invoke-Command -session $session 
                              -ScriptBlock $sb 
                              -ArgumentList $servername,$config_names
        write-host $out
        return $out
}
finally {
    Remove-PSSession $session
}

而不是使一個哈希表,並轉換成字符串的,你可以在你的工作腳本創建一些自定義對象就是這樣的SO問題

代替這個:

$output = @{}
    foreach ($cfg in $config_names) {
        $config_value = Get-Config -configname $cfg
        $output.Add("$servername : $cfg", "($config_value)")
    }
write-host $output | Out-String
return $output | Out-String

您可以嘗試這樣的事情:

$output = New-Object System.Object
Add-Member -MemberType NoteProperty -Name Server -Value $servername -InputObject  $output
foreach ($cfg in $config_names) {
   $config_value = Get-Config -configname $cfg
   Add-Member -MemberType NoteProperty -Name "Config$cfg" -Value $config_value -InputObject  $output
}
write-host $output 
return $output

由於我不確定Get-Config是什么,因此我無法進行准確的測試,但希望它足以讓您思考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM