PowerShellで情報を扱っていると、
「このデータをExcelで確認したい」
「ログをCSV形式で保存したい」
という場面がよくありますよね。
そんな時に大活躍するのが「Export-Csv」コマンドです。
Export-Csvを使えば、PowerShellの出力をそのまま表形式でCSVファイルに保存できます。
これはログ管理、レポート作成、自動集計など、業務効率化に欠かせないテクニックです。
この記事では、PowerShell初心者の方でもスムーズに使えるように、Export-Csvの基本構文から、実用的なオプション、よくあるエラーと対処法、実務レベルの応用例まで丁寧に解説します。
Export-Csvとは?

Export-Csv
は、PowerShellで取得したオブジェクト(情報)をCSV形式のファイルに出力するためのコマンドです。
CSVファイルとは、Excelなどで開ける「カンマ区切りの表形式データ」のこと。
業務でもよく使われる形式です。
PowerShellでは、さまざまなコマンドの出力結果をパイプ(|
)でExport-Csvに渡すことで、簡単にCSVファイルとして保存できます。
基本的な使い方

構文
コマンド | Export-Csv -Path "保存先のパス" -NoTypeInformation
-NoTypeInformation は必須ではありませんが、ファイル冒頭に余計な型情報を出力しないため、ほとんどのケースで付けるのが推奨されます。
具体例:すぐ使えるパターン
すぐ使えるパターンも紹介する。
例1:ファイル一覧をCSV出力
Get-ChildItem -Path "C:\Logs" | Export-Csv -Path "C:\Output\log_files.csv" -NoTypeInformation
このコマンドで、C:\Logsフォルダ内のファイル一覧がCSVファイルとして保存されます。
ファイル名、サイズ、更新日時などの情報が含まれます。
例2:稼働中のサービス一覧をCSVに保存
Get-Service | Where-Object { $_.Status -eq "Running" } | Export-Csv -Path "running_services.csv" -NoTypeInformation
現在実行中のすべてのWindowsサービスの情報がCSVファイルに保存されます。サービス名、表示名、状態などが記録されます。
例3:プロセス情報をCSVに保存(文字コード指定)
Get-Process | Export-Csv -Path "processes.csv" -Encoding UTF8 -NoTypeInformation
実行中のすべてのプロセスの情報が、UTF-8エンコードでCSVファイルに保存されます。
よく使うオプション

オプション名 | 説明 |
---|---|
-NoTypeInformation | 型情報の出力を省略(CSV先頭行に不要な行を出さない) |
-Append | 既存のCSVに追記(見出し行が重複しないよう注意) |
-Encoding | 文字コードを指定(UTF8, ASCII, Defaultなど) |
-Force | 書き込み先ファイルが存在しても強制的に上書き |
-Delimiter | 区切り文字を指定(デフォルトはカンマ「,」) |
-UseCulture | システムの地域設定に合わせた区切り文字を使用 |
-NoTypeInformationの必要性
PowerShell 5.1以前では、Export-Csvを使うと、デフォルトでCSVファイルの1行目に「#TYPE System.~」という型情報が出力されていました。
これがExcelでの読み込み時に邪魔になるため、-NoTypeInformation
を付けるのが一般的です。
PowerShell 6.0以降は、この型情報はデフォルトで出力されなくなりましたが、互換性のために明示的に指定するのが良い習慣です。
-Appendの使い方
既存のCSVファイルに追記する場合に使います:
Get-Service -Name "BITS" | Export-Csv -Path "services.csv" -NoTypeInformation
Get-Service -Name "Spooler" | Export-Csv -Path "services.csv" -Append -NoTypeInformation
注意点として、1回目の出力で列名(ヘッダー)が書き込まれるため、追記時には自動的にヘッダーを書き込まないようになっています。
応用テクニック:自作オブジェクトのCSV出力

PowerShellでは自分でオブジェクトを作成して、それをCSV出力することも可能です。
この機能は、さまざまなソースからのデータを組み合わせたり、情報を整形したりする際に非常に便利です。
単一オブジェクトの作成と出力
$data = [PSCustomObject]@{
Name = "TestUser"
Email = "test@example.com"
Date = (Get-Date).ToString("yyyy-MM-dd")
}
$data | Export-Csv -Path "users.csv" -NoTypeInformation
複数オブジェクトの配列を作成して出力
$users = @(
[PSCustomObject]@{
Name = "User1"
Email = "user1@example.com"
Department = "IT"
},
[PSCustomObject]@{
Name = "User2"
Email = "user2@example.com"
Department = "HR"
}
)
$users | Export-Csv -Path "multiple_users.csv" -NoTypeInformation
既存データを加工してCSV出力
Get-Process | Select-Object Name, CPU, WorkingSet | ForEach-Object {
[PSCustomObject]@{
ProcessName = $_.Name
CPUTime = [math]::Round($_.CPU, 2)
MemoryMB = [math]::Round($_.WorkingSet / 1MB, 2)
}
} | Export-Csv -Path "formatted_processes.csv" -NoTypeInformation
CSVファイルを開いて確認する方法(自動でExcel起動)
CSVファイルを作成した後、すぐに確認したい場合は以下のコマンドが便利です:
Invoke-Item "C:\Output\log_files.csv"
→ 作成したCSVファイルをダブルクリックするのと同じ操作が自動化できます。これにより、デフォルトのアプリケーション(通常はExcelかそれに準ずるスプレッドシートアプリ)でCSVが開きます。
よくあるエラーと対処法

エラー:ファイルが使われています
Export-Csv : ファイル 'C:\Output\log_files.csv' にアクセスできません。ファイルは別のプロセスで使用されています。
原因:CSVファイルがExcelなどで開かれたまま 対処:
- 対象ファイルを閉じる
-Force
で上書き(ただし、開いているアプリによっては失敗する場合も)- 別名で保存する(ファイル名に日時を含めるなど)
エラー:文字化けする
原因:日本語環境ではエンコード指定が必要な場合あり 対処:
-Encoding UTF8
など明示的に指定- Excel側でCSVインポート時に文字コードを指定
Get-Service | Export-Csv -Path "services.csv" -Encoding UTF8 -NoTypeInformation
エラー:パスが見つかりません
Export-Csv : パス 'C:\NonExistentFolder\file.csv' の一部が見つかりませんでした。
原因:保存先のフォルダが存在しない 対処:
- 正しいパスを指定する
- 必要なフォルダを事前に作成する
# フォルダを作成してから保存
New-Item -Path "C:\Output" -ItemType Directory -Force
Get-Service | Export-Csv -Path "C:\Output\services.csv" -NoTypeInformation
Export-Csvが活躍するシーン

ログの記録・集計
# システムイベントログを抽出してCSV保存
Get-EventLog -LogName System -Newest 100 |
Select-Object TimeGenerated, EntryType, Source, Message |
Export-Csv -Path "system_events.csv" -NoTypeInformation
レポートの自動生成
# ディスク使用状況のレポート作成
Get-WmiObject -Class Win32_LogicalDisk |
Select-Object DeviceID,
@{Name="SizeGB";Expression={[math]::Round($_.Size/1GB, 2)}},
@{Name="FreeGB";Expression={[math]::Round($_.FreeSpace/1GB, 2)}},
@{Name="FreePercent";Expression={[math]::Round($_.FreeSpace/$_.Size*100, 1)}} |
Export-Csv -Path "disk_report.csv" -NoTypeInformation
システム監視結果の保存
# 一定間隔でCPU使用率を記録
$logFile = "cpu_monitor_$(Get-Date -Format 'yyyyMMdd').csv"
while ($true) {
$cpuTime = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue
[PSCustomObject]@{
Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
CPUPercent = [math]::Round($cpuTime, 2)
} | Export-Csv -Path $logFile -Append -NoTypeInformation
Start-Sleep -Seconds 60 # 1分ごとに記録
}
バックアップ情報の一覧化
# バックアップファイルの一覧取得
Get-ChildItem -Path "D:\Backups" -Recurse -File |
Select-Object Name, LastWriteTime,
@{Name="SizeMB";Expression={[math]::Round($_.Length/1MB, 2)}} |
Export-Csv -Path "backup_files.csv" -NoTypeInformation
まとめ|Export-CsvでPowerShell出力をスマートに記録・共有しよう
PowerShellのExport-Csv
は、業務の現場で「データを可視化」「記録に残す」「報告に使う」ために欠かせない武器です。
たった1行で、情報を表形式で扱いやすく保存できるのは、Excelを使うユーザーとの橋渡しにもなります。
本記事のポイント:
Export-Csv
はオブジェクトをCSV形式で保存するコマンド-NoTypeInformation
はほぼ必須-Encoding
や-Append
で柔軟な出力が可能- カスタムオブジェクトと組み合わせることで、より高度なデータ整形も可能
- 実務でのログ・レポート出力に非常に便利
PowerShellを業務に活かすなら、Export-Csv
は絶対に押さえておきたいコマンドです。
ぜひ日々のスクリプトに組み込んで、情報の見える化・共有の効率化に役立ててください。
コメント