2017-12-28 30 views
-2

入力反復を輸出しない内-メンバーを追加します。外のforeachループをCSVに

サーバー:[1,2,3]
サービス:[A、B、C]を

サーバー1 ""
サーバ2は、 "B" のサービス "A" を有するサービスを有する
サーバ3は、サービス "B"、 "C" を有する

CSVで

予想出力は(コンソール上の正しい出力が得られた) 。

CSVで
 
Server_Name ServerAvailability ServiceName[0] ServiceStatus[0] ServiceName[1] ServiceStatus[1] 
1 Up a Running 
2 Up a Running b Running 
3 Up b Running c Running 

実際の出力:

 
Server_Name ServerAvailability ServiceName[0] ServiceStatus[0] ServiceName[1] ServiceStatus[1] 
1 Up a Running 
2 Up a Running 
3 Up b Running 
foreach ($s in $servers) { 
    foreach ($srv in $services) { 
     $Asrv = Get-Service -Name $srv -ComputerName $s 
     if ($Asrv -ne $null) { 
      $HashSrvs.Add($Asrv.Name, $Asrv.Status) 
     } 
    } 

    $infoObject = @() 
    $infoObject = New-Object PSObject 
    $infoObject | Add-Member -MemberType NoteProperty -Name "Server name" -Value $s 
    $infoObject | Add-Member -MemberType NoteProperty -Name "ServerAvailability" -Value $ConStatus 

    $i=0 

    foreach ($key in $HashSrvs.GetEnumerator()) { 
     $infoObject | Add-Member -MemberType NoteProperty -Name "ServiceName[$i]" -Value $key.Key -Force 
     $infoObject | Add-Member -MemberType NoteProperty -Name "ServiceStatus[$i]" -Value $key.Value -Force 
     $i++ 
    } 
    $infoColl += $infoObject 
} 
$infoColl | Export-Csv -NoTypeInformation -Path .\Server_Inventory_$((Get-Date).ToString('MM-dd-yyyy')).csv -Encoding UTF8

出力が正しいです。エラーは表示されません。このエラーはCSVファイルで発生します。強調表示されたforeachループは反復されません。それはService Name[0]Service Status[0]で停止します。これで私を助けてください。

+3

編集ご質問)あなたの間違った例2)あなたが期待している出力の例。 –

答えて

0

Export-Csvの仕組みを誤解しています。コマンドレットはオブジェクトのリストを入力として受け取り、そのリスト内の最初のオブジェクトからCSVの列を決定します。後続のすべてのオブジェクトで、欠落しているプロパティーはヌル値で埋められ、追加のプロパティーは省略されます。

結果を得るには、サービスの最大数を知り、その数のプロパティを各オブジェクトに追加する必要があります。また、カンマで区切った文字列のリストを作成し、Set-ContentまたはOut-Fileを使用してCSVを手動で作成することもできます。どちらも、当然のことながら、なんとかですが、はるかに簡単、はるかに簡単な方法は、別の区切り文字で単一の列にサービスのリストを置くことになる:1を含むように

$infoColl = foreach ($s in $servers) { 
    $svc = Get-Service -Name $services -Computer $s -ErrorAction SilentlyContinue | 
      ForEach-Object { '{0}={1}' -f ($_.Name, $_.Status) } 

    New-Object PSObject -Property @{ 
     'Server name'  = $s 
     'ServerAvailability' = $ConStatus 
     'Services'   = $svc -join '|' 
    } 
} 
関連する問題