Как экспортировать две переменные в один CSV, объединенный через PowerShell? - PullRequest
0 голосов
/ 09 октября 2019

У меня есть сценарий PowerShell, использующий модуль poshwsus, как показано ниже:

$FileOutput = "C:\WSUSReport\WSUSReport.csv"
$ProcessLog = "C:\WSUSReport\QueryLog2.txt"
$WSUSServers = "C:\WSUSReport\Computers.txt"
$WSUSPort = "8530"

import-module poshwsus 

ForEach ($Server in Get-Content $WSUSServers)
{
    & connect-poshwsusserver $Server -port $WSUSPort | out-file $ProcessLog -append
    $r1 = & Get-PoshWSUSClient | select @{name="Computer";expression={$_.FullDomainName}},@{name="LastUpdated";expression={if ([datetime]$_.LastReportedStatusTime -gt [datetime]"1/1/0001 12:00:00 AM") {$_.LastReportedStatusTime} else {$_.LastSyncTime}}}
    $r2 = & Get-PoshWSUSUpdateSummaryPerClient -UpdateScope (new-poshwsusupdatescope) -ComputerScope (new-poshwsuscomputerscope) | Select Computer,NeededCount,DownloadedCount,NotApplicableCount,NotInstalledCount,InstalledCount,FailedCount

}

Что мне нужно сделать, это экспортировать выход CSV, включая результаты со столбцами (например, «внутреннее объединение»):

Computer, NeededCount, DownloadedCount, NotApplicableCount, NotINstalledCount, InstalledCount, FailedCount, LastUpdated

Я пытался использовать приведенную ниже строку в foreach, но она не сработала, как я ожидал.

$r1 + $r2 | export-csv -NoTypeInformation -append $FileOutput

Буду признателен, если вы поможете или посоветуете.

РЕДАКТИРОВАТЬ -> Вывод, который я получил:

ComputerName LastUpdate
X                A
Y                B
X
Y

Так что без ошибок, первые две строки из $ r2, последние две строки из $ r1, это не присоединение к таблицам, как я ожидал.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Я думаю, это можно сделать проще. Поскольку параметр Select-Object '-Property принимает массив значений, вы можете создать массив свойств, которые вы хотите отобразить. Массив может быть создан путем сравнения свойств двух ваших объектов и вывода уникального списка этих свойств.

$selectProperties = $r1.psobject.properties.name | Compare-Object $r2.psobject.properties.name -IncludeEqual -PassThru
$r1,$r2 | Select-Object -Property $selectProperties

Compare-Object по умолчанию выведет только различия между эталонным объектом иобъект разницы. Добавление переключателя -IncludeEqual отображает различные и равные сравнения. Добавление параметра -PassThru выводит фактические сравниваемые объекты, а не вывод по умолчанию PSCustomObject.

0 голосов
/ 09 октября 2019

Я нашел свое руководство в этом посте: Внутреннее объединение в PowerShell (без SQL)

Соответственно изменил мой запрос, как показано ниже, работает как шарм.

$FileOutput = "C:\WSUSReport\WSUSReport.csv"
$ProcessLog = "C:\WSUSReport\QueryLog.txt"
$WSUSServers = "C:\WSUSReport\Computers.txt"
$WSUSPort = "8530"

import-module poshwsus 

function Join-Records($tab1, $tab2){
    $prop1 = $tab1 | select -First 1 | % {$_.PSObject.Properties.Name} #properties from t1
    $prop2 = $tab2 | select -First 1 | % {$_.PSObject.Properties.Name} #properties from t2
    $join = $prop1 | ? {$prop2 -Contains $_}
    $unique1 = $prop1 | ?{ $join -notcontains $_}
    $unique2 = $prop2 | ?{ $join -notcontains $_}


    if ($join) {
        $tab1 | % {
            $t1 = $_
            $tab2 | % {
                $t2 = $_
                foreach ($prop in $join) {
                    if (!$t1.$prop.Equals($t2.$prop)) { return; }
                }
                $result = @{}                
                $join | % { $result.Add($_,$t1.$_) }
                $unique1 | % { $result.Add($_,$t1.$_) }
                $unique2 | % { $result.Add($_,$t2.$_) }
                [PSCustomObject]$result
            }
        }
    }
}

ForEach ($Server in Get-Content $WSUSServers)
{
    & connect-poshwsusserver $Server -port $WSUSPort | out-file $ProcessLog -append
    $r1 = & Get-PoshWSUSClient | select @{name="Computer";expression={$_.FullDomainName}},@{name="LastUpdated";expression={if ([datetime]$_.LastReportedStatusTime -gt [datetime]"1/1/0001 12:00:00 AM") {$_.LastReportedStatusTime} else {$_.LastSyncTime}}}
    $r2 = & Get-PoshWSUSUpdateSummaryPerClient -UpdateScope (new-poshwsusupdatescope) -ComputerScope (new-poshwsuscomputerscope) | Select Computer,NeededCount,DownloadedCount,NotApplicableCount,NotInstalledCount,InstalledCount,FailedCount
    Join-Records $r1 $r2 | Select Computer,NeededCount,DownloadedCount,NotApplicableCount,NotInstalledCount,InstalledCount,FailedCount, LastUpdated | export-csv -NoTypeInformation -append $FileOutput

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...