WindowsコマンドやPowerShellの実行結果を保存する方法

WindowsコマンドやPowerShellの実行結果を保存する方法。

WindowsのコマンドプロンプトやPowerShellでコマンドを実行した場合、通常、コマンドの実行結果やエラーは画面上に表示されますが、バッチファイルやスクリプトファイルとしてコマンドを実行するようなケースでは、コマンドの実行結果やエラーを記録しておきたいときがあります。

そこでここでは、WindowsコマンドやPowerShellの実行結果やエラーを記録する方法として、ファイルに出力する方法とイベントログに記録する方法を解説します。

ファイルに出力する方法

リダイレクト

WindowsコマンドやPowerShellの実行結果やエラーをファイルに出力する最も一般的な方法は、リダイレクトを使った方法です。

たとえば、systeminfoコマンドをそのまま実行すると、以下の画像のようにさまざまな情報が画面に出力され、そのままでは内容を確認しづらいですが、リダイレクトを使ってコマンドの実行結果をテキストファイルに出力すれば、後から内容を確認したり検索しやすくなります。

WindowsコマンドやPowerShellの実行結果を保存する方法。

たとえば、以下のコマンドでは、systeminfoコマンドの実行結果を「D:\result.txt」に出力しています。

C:\> systeminfo > D:\result.txt

WindowsコマンドやPowerShellの実行結果を保存する方法。

リダイレクトでファイルに出力する方法としては、次のような種類があります。

コマンド説明
コマンド > ファイルコマンドの実行結果をファイルに出力する
コマンド >> ファイルコマンドの実行結果をファイルに追記する
コマンド 2> ファイルコマンドのエラーをファイルに出力する
コマンド 2>> ファイルコマンドのエラーをファイルに追記する
コマンド > ファイル 2>&1コマンドの実行結果とエラーをファイルに出力する
コマンド >> ファイル 2>&1コマンドの実行結果とエラーをファイルに追記する

なお、Windowsコマンドの実行結果をリダイレクトでファイルに出力する場合は、実行するコマンドによって、文字コードが「ANSI(Shift_JIS)」で出力される場合と「UTF-16 LE」で出力される場合があるので注意が必要です。

Out-Fileコマンドレット

PowerShellのOut-Fileコマンドレット使えば、コマンドの実行結果をファイルに出力することができます。

たとえば、以下のコマンドでは、ipconfigコマンドの実行結果を「D:\result.txt」に出力しています。

PS C:\> ipconfig | Out-File -FilePath 'D:\result.txt'

「-Append」オプションを付加して実行すれば、既存ファイルに追記することもできます。

PS C:\> ipconfig | Out-File -FilePath 'D:\result.txt' -Append

Out-Fileコマンドレットで出力されるテキストファイルの文字コードは、デフォルトでは「UTF-16 LE」ですが「-Encoding」オプションで出力する文字コードを指定できます。たとえば、以下では「ANSI(Shift_JIS)」で出力しています。

PS C:\> ipconfig | Out-File -FilePath 'D:\result.txt' -Encoding default

PowerShellには文字列をテキストファイルに記録するコマンドとして、Set-ContentやAdd-Contentコマンドレットがありますが、これらのコマンドはリードロック(読み取りロック)が掛かる仕様で、コマンドの実行結果などをファイルに記録している最中は出力ファイルを閲覧できません。

そのため、コマンドの実行結果をファイルに保存する場合は、Out-Fileコマンドレットの使用がおすすめです。

Tee-Objectコマンドレット

PowerShellのTee-ObjectコマンドレットはLinuxのteeコマンドと似たコマンドで、コマンドの実行結果を画面に出力しつつファイルにも出力することができます。

たとえば、以下のコマンドでは、Get-Processコマンドレットの実行結果を画面に出力しつつ「D:\result.txt」にも出力しています。

PS> Get-Process | Tee-Object -FilePath 'D:\result.txt'

「-Append」オプションを付加して実行すれば、既存ファイルに追記することもできます。

PS> Get-Process | Tee-Object -FilePath 'D:\result.txt' -Append

パイプでOut-Fileコマンドレットを続けば、コマンドの実行結果を2つのファイルに保存できます。

PS> Get-Process | Tee-Object -FilePath 'D:\result.txt' | Out-File 'D:\result2.txt'

イベントログに記録する方法

Windows環境では、オペレーティングシステムやアプリケーションの動作に関する記録がイベントログに記録されており、コマンドの実行結果をイベントログに記録することもできます。

eventcreateコマンド

Windowsコマンドでイベントログを記録するには、eventcreateコマンドを利用します。以下では、eventcreateコマンドの使用例を紹介します。

システムイベントログに、イベントID999のエラーイベントを記録するには、以下のようにコマンドを実行します。

> eventcreate /t ERROR /id 999 /l system  /d "処理Aで異常が発生しました。"

アプリケーションイベントログに、イベントID1000の情報イベントを記録するには、以下のようにコマンドを実行します。

> eventcreate /t INFORMATION /id 1000 /l application /d "処理Aが正常終了しました。"

アプリケーションイベントログに、イベントID200でイベントソースが「wintest」の警告イベントを記録するには、以下のようにコマンドを実行します。

> eventcreate /t WARNING /id 200 /so wintest /l application /d "処理Aで警告が発生しました。"

Write-EventLogコマンドレット

PowerShellコマンドレットでイベントログを記録するには、Write-EventLogコマンドレットを利用します。以下では、Write-EventLogコマンドレットの使用例を紹介します。

システムイベントログに、イベントID999のエラーイベントを記録するには、以下のようにコマンドを実行します。

PS> Write-EventLog -LogName System -Source EventLog -EventID 999 -EntryType Error -Message "処理Aで異常が発生しました。"

アプリケーションログに、イベントID100でイベントソースが「SecurityCenter」の情報イベントを記録したいときは、以下のようにコマンドを実行します。

PS> Write-EventLog -LogName Application -Source SecurityCenter -EventID 100 -Message "処理Aが正常終了しました。"

なお、Write-EventLogコマンドレットでカスタムイベントを記録するには、イベントソースの指定が必須ですが、未登録のイベントソースを指定するとエラーとなってしまいます。

そのため、新しいイベントソースを指定してカスタムイベントを記録するには、New-EventLogコマンドレットを使ってあらかじめイベントソースを作成しておく必要があります。

たとえば、アプリケーションログに新しいイベントソース「Wintest」を作成するには、以下のようにコマンドを実行します。

PS> New-EventLog -LogName Application -Source Wintest

また、New-EventLogコマンドレットでは、イベントソースを作成するだけでなく、新しいイベントログの種類を作成することもできます。

たとえば、新しいイベントログの種類として「MyLog」を、イベントソースとして「TaskInfo」を作成したいときは、以下のようにコマンドを実行します。

PS> New-EventLog -LogName MyLog -Source TaskInfo

なお、追加したイベントソースやイベントログの種類を削除したいときは、Remove-EventLogコマンドレットを利用します。

PS> Remove-EventLog -Source Wintest
PS> Remove-EventLog -Logname MyLog

あとがき

WindowsコマンドやPowerShellコマンドレットを、バッチファイルやスクリプトファイルで実行する場合は、実行結果をファイルに出力したりイベントログに記録するなどしておけば、正常に実行されたかなどを確認する際に便利です。