はじめに
前回は、PowerShell カスタムオブジェクト作成の基本の型について紹介しました。
思ったよりも簡単に作成できる、と思った方も多いのではないでしょうか。
今回は基本の型を使って、複数のデバイスから情報を収集し、1つの CSV ファイルに出力してみたいと思います。
事前準備
PowerShell の実行元 ⇔ 実行先のデバイス間で、リモートコマンドの実行を許可する必要があります。
※実行の許可を行う際は、セキュリティに十分留意した上で行う必要があります。
実現したいこと
- 管理サーバーから同一ネットワーク内の複数デバイスに PowerShell リモート接続
- OS バージョンとビルド、言語、ローカルタイムゾーンの情報を取得
- 1つの CSV ファイルにまとめて出力
やってみる
実際にスクリプトを書いてみます。
ホスト名のリストを読み込んで、OS 情報の取得とカスタムオブジェクトの作成を繰り返し実行します。
#出力パスを定義
$CurrentPath = "C:\Work\Get-Script"
$ToDay = $(Get-Date).ToString("yyyyMMdd")
$FilePath = $CurrentPath + "\" + $ToDay + "_Get-OSInfo.csv"
#リモート接続するデバイスのホスト名のリストを定義
$HostList = "C:\Work\Get-Script\HostList.txt"
$Collection =New-Object System.Collections.ArrayList
#ホスト名のリストから一行ずつ読み込んで繰り返し処理を実行
ForEach ($HostName in Get-Content $HostList) {
#OS情報を取得
$OS = (gwmi win32_OperatingSystem -ComputerName $HostName).Caption
$Build = (gwmi win32_OperatingSystem -ComputerName $HostName).BuildNumber
$Language = (gwmi win32_OperatingSystem -ComputerName $HostName).OSLanguage
$TimeZone = (gwmi win32_OperatingSystem -ComputerName $HostName).CurrentTimeZone
$Property = New-Object -TypeName PSObject
$Property |Add-Member -Type NoteProperty -Name "ホスト名" -Value $HostName
$Property |Add-Member -Type NoteProperty -Name "オペレーティングシステム" -Value $OS
$Property |Add-Member -Type NoteProperty -Name "ビルド" -Value $Build
$Property |Add-Member -Type NoteProperty -Name "言語" -Value $Language
$Property |Add-Member -Type NoteProperty -Name "タイムゾーン" -Value $TimeZone
#戻り値の後始末
[void]$Collection.add($Property)
$Property = ""
}
$Collection |Export-Csv $FilePath -Encoding Default -NoTypeInformation -Force
出力結果は以下のようになりました。
同じプロパティが縦に並ぶので、比較しやすいですね。
注意点として、デバイス毎に値の数が異なるような結果になるものは
プロパティ列に値がきれいに収まらないので、この方法の出力に不向きです。
おわりに
いかがでしたでしょうか。
カスタムオブジェクトの基本の型を応用して、欲しい値だけを一括で見やすく CSV ファイルに出力することができました。
スクリプトの中で読み込むホスト名も、外部データとして読み込む形式にすることで、ホスト名のリストを編集するだけで、色々な組み合わせのデータを素早く収集することが可能です。
カスタムオブジェクトの活用に、本記事が少しでも役に立てば幸いです。