2016-05-17 126 views
0

Powershellで複数のテーブルを結合して作成し、SQLのUNIONクエリと同様に、使いやすい形式でレポートとして出力しようとしています。Powershellで複数のテーブルの結合を作成する

I次のコードを持っている:

$ft = @{auto=$true; [email protected]("MachineName", "Status", "Name", "DisplayName")} 
$hosts = @("svr001", "svr002") 
$report = @() 
ForEach ($h in $hosts) { 
    $results = Get-Service -CN $h -Name MyService 
    $report += $results | Format-Table @ft 
    # Other things occur here, which is why I'm creating $report for output later. 
} 
Write-Output $report 

次のようにこのコードの出力は次のとおりです。

MachineName Status Name  DisplayName 
----------- ------ ----  ----------- 
svr001  Running MyService MyServiceDisplayName 



MachineName Status Name  DisplayName 
----------- ------ ----  ----------- 
svr002  Running MyService MyServiceDisplayName 

あなたは、単にPowerShellで組合を行うために配列を追加しているので(すなわち、 $union = @(0, 1, 2) + @(3, 4, 5))私の最初の考えは、私が を得なければならないということでした。

MachineName Status Name  DisplayName 
----------- ------ ----  ----------- 
svr001  Running MyService MyServiceDisplayName 
svr002  Running MyService MyServiceDisplayName 

振り返ってみると、ではなくが出力されますが、 2番目の出力例の2つの表の和集合を1つの表に2番目のように作成する方法が不明です。正しい方向に私を送ってくれるドキュメントや例の中に何かを見つけることができませんでした。

+2

移動 '| Format-Table ....... 'を' write-output $ report'の最後の行に追加します。 'format- *'コマンドレットの出力を保存しないでください。 –

+0

レコードの場合、複数のコンピュータ名をGet-Serviceに渡すことができます。ForEachループはコードのその部分には必要ありません。 –

+0

'Format- *'コマンドレットからの出力を保存しないという点が分かりましたが、それは次の出力を生成します: 'System.ServiceProcess.ServiceController System.ServiceProcess.ServiceController System.ServiceProcess.ServiceControllerSystem.ServiceProcess.ServiceController System.ServiceProcess .ServiceController System.ServiceProcess.ServiceController'。 –

答えて

2

Format-Tableを最後のコマンドに移動します。 Format-*コマンドレットでは、手動で作業することができない特別な形式のオブジェクトを作成するため、これらのオブジェクトは保存されません。 Format-*の結果を配列に保存すると、結果として2つのテーブルが2つのレポートで構成される「レポート」が保存されます。

データを収集してから、結果を表示する場合はFormat-Tableを使用してください。

$ft = @{auto=$true; [email protected]("MachineName", "Status", "Name", "DisplayName")} 
$hosts = @("svr001", "svr002") 
$report = @() 
ForEach ($h in $hosts) { 
    $results = Get-Service -ComputerName $h -Name MyService 
    $report += $results 
    # Other things occur here, which is why I'm creating $report for output later. 
} 

#Write-Output is not necessary as it is default behaviour 
$report | Format-Table @ft 

(サービス名としてwuauservを使用)サンプル出力:

MachineName Status Name  DisplayName 
----------- ------ ----  ----------- 
localhost Stopped wuauserv Windows Update 
frode-pc Stopped wuauserv Windows Update 
0

Get-Serviceレットも-ComputerNameパラメータの文字列の配列をサポートします。これは、私の作品:WUAUSERVを使用して

Get-Service -CN $hosts -Name MyService | Format-Table @ft 

サンプル出力:

MachineName Status Name  DisplayName 
----------- ------ ----  ----------- 
Tim-SRV1 Running wuauserv Windows Update 
Tim-SRV2 Stopped wuauserv Windows Update 
+1

これは質問に答えず、コメントとして所属しています。彼のサンプルによると、 "foreach host" -loopにはより多くのコマンドがあるので、foreachループを削除できる保証はありません。 –

+0

しかし、私のテストでは、 'Get-Service -CN $ hosts -Name MyService | Format-Table @ ft'は、リスト内の最初のサーバのサービスのみを取得する。 Powershell 2.0を使用しています.PowerShellのバージョンは、この環境で制御できるものではありません**。 –

+1

はい、PowerShell 2です。0の場合は、少なくともPS 5.0コンピュータで最初に( 'powershell -version 2'を使ってテストしたときに)受け取るだけです。それがバグか、配列サポートが欠落しているかどうかを確認するには、Win7-comp 2.0ドキュメントを持っていないでください。 PS 3 +でそれは配列入力とうまく動作するはずです –

関連する問題