PowerShell から CSV ファイルにデータをエクスポートしたいのですね。5 分ごとに行うような作業ではありませんが、簡単なレポートが必要な場合や、単に何かをログに記録したい場合には、Export-CSVコマンドレットが救世主となります。正直、非常に簡単なので不思議ですが、注意しないと CSV ファイルはヘッダーが欠落したり、区切り文字が間違っていたりするなど、乱雑になる可能性があります。通常、コマンドを実行しても正しいエンコードや区切り文字を設定することを忘れる人を見てきました。これは、後で Excel でファイルを開くときに面倒なことになります。そのため、データが最初から正しく出力され、読み取り可能な状態を維持するために、どのオプションを微調整する必要があるかを知っておく価値があります。また、上書きするのではなく行を追加できるのも非常に便利で、ディスク領域やプロセス リストなどの進行中のデータを記録するスケジュールされたスクリプトに最適です。コツをつかめば、システム情報やその他の表形式データのエクスポートがはるかに高速になり、イライラすることがなくなります。
PowerShell を使用してデータを CSV ファイルにエクスポートする方法
方法1: サービスリストの基本的なエクスポート
これは典型的な例です。Windowsサービスの名前、表示名、ステータスを含む簡単なリストが欲しいとします。これは監査やトラブルシューティングに役立ちます。このコマンドはオブジェクトをカンマ区切りの文字列に変換し、CSVファイルに書き込みます。- NoTypeInformationフラグを指定しないと、オブジェクトの種類に関する情報を含む、やや肥大化したファイルが作成されます。この情報は不要な場合があり、単に混乱を招くだけです。
Get-Service | Select-Object Name, DisplayName, Status | Export-CSV "C:\PS\services.csv" -NoTypeInformation -Encoding UTF8
一部の設定では、最初の試みで問題なく動作しますが、Excelでファイルを開いた際に書式がおかしくなる場合は、区切り文字を確認してください。デフォルトはカンマですが、地域設定でセミコロンが区切り文字として使用されている(多くのヨーロッパのロケールなど)場合は、データが圧縮されたり、文字化けしたりする可能性があります。その場合は、-Delimiterパラメータを使用して、セミコロンなどの別の区切り文字を指定できます。
Get-Service | Export-Csv "C:\PS\services.csv" -NoTypeInformation -Encoding UTF8 -Delimiter ";"
また、地域設定を扱う場合、PowerShell は-UseCultureフラグを使用して地域設定を尊重できるため、ほとんどの場合、区切り文字を手動で変更する必要はありません。
Get-Process | Export-Csv "c:\ps\process.csv" -UseCulture
デフォルトの区切り文字が何であるかを再確認するには、次のコマンドを実行します。
(Get-Culture).TextInfo. ListSeparator
地域区切り文字 (おそらくコンマまたはセミコロン) が表示されます。エクスポートした CSV を共有または分析するときに覚えておくと便利です。
方法2: 進行中のログにデータを追加する
空きディスク容量、ネットワーク統計、ユーザー アカウントなどのデータを定期的に生成するスクリプトを実行する場合、既存の CSV にデータを追加したいことがあるでしょう。そこで-Appendの出番です。PowerShell はデフォルトでファイルを上書きしますが、-Appendを使用すると、以前の情報を失うことなく新しい行を追加し続けることができます。
$cur_time = get-date -Format u $disks = Get-CimInstance -Class Win32_LogicalDisk | Where-Object { $_. DeviceID -eq "C:" } | Select-Object DeviceID, FreeSpace $disks | Add-Member -MemberType NoteProperty -Name Date -Value $cur_time $disks | Export-Csv -Path "C:\ps\freespace.csv" -Delimiter ";" -NoTypeInformation -Append
基本的に、ディスク情報オブジェクトに現在のタイムスタンプを追加し、それをCSVファイルに追加します。スケジュールされたタスクの実行時に、ディスク使用履歴やユーザーアクティビティなどの継続的なログを作成するのに便利です。
追加の調整とオプション
- -エンコーディング:私は通常UTF8に設定しています。特に特殊文字を扱う場合、互換性を保つことができます。
- -Force : 読み取り専用ファイルを上書きし、エラーを避けたい場合に使用します。
- -NoClobber : 誤って既存のファイルを上書きするのを防ぎます。
- -Header : 特にファイルのマージやデータのクリーンアップ時に、必要に応じてカスタム ヘッダーを追加します。
- -IncludeTypeInformation/-NoTypeInformation : PowerShell にCSV に#TYPE行を含めるかスキップするかを指示します。他のツールにインポートする場合に便利です。
- -UseQuotes : PowerShell Core 7.x で導入され、値を引用符で囲むかどうかを制御し、フィールドにコンマまたは引用符が含まれている場合にデータの破損を防ぐことができます。
この最後の部分は、あらゆる種類の CSV 解析の悪夢からあなたを救うことができます。
さまざまなレポートでCSVエクスポートを試す
Active Directory内のリモートコンピュータの監査、サインイン時間のログ記録、RDP接続履歴のエクスポートなど、PowerShellのエクスポート機能を使えば、これらすべてが簡単に行えます。例えば、Active Directoryのコンピュータ情報をエクスポートするには、次のようにします。
Get-ADComputer -Filter * | Select-Object Name, OperatingSystem, LastLogonDate | Export-CSV "C:\PS\ad_computers.csv" -NoTypeInformation
あるいは、モジュールと権限に応じて、ユーザーアクティビティログを取得することもできます。重要なのは、データソースに合わせてコマンドを調整することです。
これで少しでも頭を悩ませる必要がなくなり、スクリプトが少し洗練されることを願っています。適切なオプションを事前に設定しておけば、後から後戻りする必要がなくなります。
まとめ
- データのダンプとレポートをすばやく作成するには、Export-CSVを使用します。
- 地域設定でカンマが使用されない場合は、必ず-Delimiterを設定してください。
- 進行中のログまたは増分データ収集には-Append を検討してください。
- -Encoding、-Force、-UseQuotesなどの他のオプションを試して、正しい書式を設定します。
- サービス、プロセス、AD 情報、システム ログなど、ほぼすべてのものをエクスポートできます。
まとめ
PowerShellからCSVにデータを取り出すのはそれほど難しいことではありませんが、初心者はいくつかの癖につまずくかもしれません。区切り文字とエンコードに関するオプションを理解すれば、作業はずっとスムーズになります。通常、最も難しいのは、地域の設定やデータを入力するツールに応じてこれらのパラメータを調整することを覚えておくことです。これでエクスポートの手間が少し軽減され、便利なレポートを素早く作成できるようになります。頑張ってください。ファイルが常に正しくフォーマットされますように!