簡単な説明
PowerShell からテキスト ファイルに出力をリダイレクトする方法について説明します。
詳細な説明
既定では、PowerShell は出力を PowerShell ホストに送信します。 通常、これはコンソール アプリケーションです。 ただし、出力をテキスト ファイルにリダイレクトしたり、エラー出力を通常の出力ストリームにリダイレクトしたりすることができます。
出力のリダイレクトには次のような方法を使用できます。
コマンド出力をテキスト ファイルに送信する
Out-File
コマンドレットを使用します。 通常、Out-File
コマンドレットは、Encoding
、Force
、Width
、またはNoClobber
パラメーターなどのパラメーターを使用する必要がある場合に使用します。コマンド出力をテキスト ファイルに送信し、その後パイプラインに送信する
Tee-Object
コマンドレットを使用します。PowerShell リダイレクト演算子を使用します。 リダイレクト演算子 (
>
) を使用した PowerShell コマンド (コマンドレット、関数、スクリプト) の出力のリダイレクトは、追加のパラメーターを使用しないOut-File
へのパイプ処理と機能的に同等です。 PowerShell 7.4 では、ネイティブ コマンドの stdout ストリームをリダイレクトするために使用した場合のリダイレクト演算子の動作が変更されました。
詳細については、「about_Output_Streams」を参照してください。
リダイレクト可能な出力ストリーム
PowerShell は、次の出力ストリームのリダイレクトをサポートしています。
ストリーム # | 説明 | 導入バージョン | 書き込みコマンドレット |
---|---|---|---|
1 | 成功ストリーム | PowerShell 2.0 | Write-Output |
2 | エラー ストリーム | PowerShell 2.0 | Write-Error |
3 | 警告ストリーム | PowerShell 3.0 | Write-Warning |
4 | 詳細ストリーム | PowerShell 3.0 | Write-Verbose |
5 | デバッグ ストリーム | PowerShell 3.0 | Write-Debug |
6 | 情報ストリーム | PowerShell 5.0 | $ |
* | すべてのストリーム | PowerShell 3.0 |
PowerShell にも進行状況ストリームがありますが、リダイレクトはサポートしていません。
重要
成功ストリームとエラー ストリームは、他のシェルの stdout ストリームと stderr ストリームに似ています。 ただし、stdin は入力用の PowerShell パイプラインに接続されていません。
PowerShell リダイレクト演算子
PowerShell リダイレクト演算子は次のとおりです。n
はストリーム番号を表します。
成功ストリーム ( 1
) は、ストリームが指定されていない場合の既定値です。
Operator | 説明 | 構文 |
---|---|---|
> |
指定したストリームをファイルに送信します。 | n> |
>> |
指定したストリームをファイルに追加します。 | n>> |
>&1 |
指定したストリームを成功ストリームにリダイレクトします。 | n>&1 |
Note
いくつかの Unix シェルとは異なり、他のストリームを成功ストリームにリダイレクトするしかできません。
ネイティブ コマンドからのリダイレクト出力
PowerShell 7.4 では、ネイティブ コマンドの stdout ストリームをリダイレクトするために使用した場合のリダイレクト演算子の動作が変更されました。 ネイティブ コマンドからの出力をリダイレクトする場合に、リダイレクト演算子がバイトストリーム データを保持するようになりました。 PowerShell はリダイレクトされたデータを解釈したり、書式を追加したりすることはありません。 詳細については、例 #7 に関する部分を参照してください。
例
例 1: エラーと出力をファイルにリダイレクトする
この例では、成功するアイテムと失敗するアイテムのそれぞれに対して dir
を実行します。
dir C:\, fakepath 2>&1 > .\dir.log
2>&1
を使用してエラーストリームを成功ストリームにリダイレクトし、>
その結果となる成功ストリームを dir.log
という名前のファイルに送信します。
例 2: すべてのサクセス ストリーム データをファイルに送信する
この例では、すべての成功ストリーム データを script.log
というファイルに送信します。
.\script.ps1 > script.log
例 3: 成功ストリーム、警告ストリーム、エラー ストリームをファイルに送信する
この例では、望ましい結果を得るためのリダイレクト演算子の組み合わせ方法を示しています。
&{
Write-Warning "hello"
Write-Error "hello"
Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
-
3>&1
は、警告ストリームを成功ストリームにリダイレクトします。 -
2>&1
は、エラー ストリームを成功ストリームにリダイレクトします (警告ストリームのデータもすべて含まれるようになります)。 -
>
は、成功ストリーム (警告ストリームとエラー ストリームの両方を含む) をC:\temp\redirection.log
というファイルにリダイレクトします。
例 4: すべてのストリームをファイルにリダイレクトする
この例では、script.ps1
というスクリプトからのすべてのストリーム出力を script.log
というファイルに送信します。
.\script.ps1 *> script.log
例 5: Write-Host ストリームと Write-Information ストリームのデータをすべて消去する
この例では、すべての情報ストリーム データを抑制します。 情報ストリーム コマンドレットの詳細については、Write-Host と Write-Information を参照してください
&{
Write-Host "Hello"
Write-Information "Hello" -InformationAction Continue
} 6> $null
例 6: アクション設定の効果の表示
アクション設定変数とパラメーターは、特定のストリームに書き込まれる内容を変更できます。 この例のスクリプトは、$ErrorActionPreference
の値がエラー ストリームに書き込まれる内容にどのように影響するかを示しています。
$ErrorActionPreference = 'Continue'
$ErrorActionPreference > log.txt
Get-Item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'SilentlyContinue'
$ErrorActionPreference >> log.txt
Get-Item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'Stop'
$ErrorActionPreference >> log.txt
try {
Get-Item /not-here 2>&1 >> log.txt
}
catch {
"`tError caught!" >> log.txt
}
$ErrorActionPreference = 'Ignore'
$ErrorActionPreference >> log.txt
Get-Item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'Inquire'
$ErrorActionPreference >> log.txt
Get-Item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'Continue'
このスクリプトを実行すると、$ErrorActionPreference
が Inquire
に設定されている場合にプロンプトが表示されます。
PS C:\temp> .\test.ps1
Confirm
Can't find path 'C:\not-here' because it doesn't exist.
[Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help (default is "Y"): H
Get-Item: C:\temp\test.ps1:23
Line |
23 | Get-Item /not-here 2>&1 >> log.txt
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| The running command stopped because the user selected the Stop option.
ログ ファイルを調べると、次のように表示されます。
PS C:\temp> Get-Content .\log.txt
Continue
Get-Item: C:\temp\test.ps1:3
Line |
3 | Get-Item /not-here 2>&1 >> log.txt
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Cannot find path 'C:\not-here' because it does not exist.
SilentlyContinue
Stop
Error caught!
Ignore
Inquire
例 7: ネイティブ コマンドからのバイナリ データのリダイレクト
PowerShell 7.4 以降の PowerShell は、ネイティブ コマンドの stdout ストリームをファイルにリダイレクトするとき、またはバイト ストリーム データをネイティブ コマンドの stdin ストリームにパイプするときに、バイト ストリーム データを保持できます。
たとえば、ネイティブ コマンド curl
を使用すると、バイナリ ファイルをダウンロードし、それをディスクにリダイレクトを使用して保存することができます。
$uri = 'https://github.com/PowerShell/PowerShell/releases/download/v7.3.7/powershell-7.3.7-linux-arm64.tar.gz'
# native command redirected to a file
curl -s -L $uri > powershell.tar.gz
バイト ストリーム データは、別のネイティブ コマンドの stdin ストリームにパイプすることもできます。 次の例では、curl
を使用して zip 形式の TAR ファイルをダウンロードしています。
ダウンロードしたファイル データは、tar
コマンドにストリーミングされ、アーカイブの内容が抽出されます。
# native command output piped to a native command
curl -s -L $uri | tar -xzvf - -C .
PowerShell コマンドのバイト ストリーム出力をネイティブ コマンドの入力にパイプすることもできます。 次の例では、Invoke-WebRequest
を使用して、前の例と同じ TAR ファイルをダウンロードしています。
# byte stream piped to a native command
(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
# bytes piped to a native command (all at once as byte[])
,(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
この機能では、stderr 出力を stdout にリダイレクトするとき、バイト ストリーム データをサポートしません。 stderr および stdout ストリームを結合すると、結合されたストリームは文字列データとして扱われます。
メモ
データを追加しないリダイレクト演算子 (>
と n>
) は、指定されたファイルの現在の内容を警告なしで上書きします。
ただし、ファイルが読み取り専用ファイル、隠しファイル、またはシステム ファイルである場合、リダイレクトは失敗します。 追加リダイレクト演算子 (>>
と n>>
) は読み取り専用ファイルには書き込まず、システム ファイルや隠しファイルに内容を追加します。
読み取り専用ファイル、隠しファイル、またはシステム ファイルへのコンテンツのリダイレクトを適用するには、Out-File
コマンドレットとその Force
パラメーターを使用します。
ファイルに書き込む場合、リダイレクト演算子は UTF8NoBOM
エンコードを使用します。 ファイルに異なるエンコードが含まれる場合、出力が正しくフォーマットされない場合があります。 異なるエンコードを使用してファイルに書き込むには、Out-File
コマンドレットをその Encoding
パラメーターと共に使用します。
ファイルへの書き込み時の出力幅
Out-File
またはリダイレクト演算子を使用してファイルに書き込む場合、PowerShell は実行中のコンソールの幅に基づいてファイルへのテーブル出力を書式設定します。 たとえば、コンソールの幅が 80 カラムに設定されているシステムで Get-ChildItem Env:\Path > path.log
のようなコマンドを使用してテーブル出力をファイルにログする場合、ファイルの出力は次のように 80 文字に切り詰められます。
Name Value
---- -----
Path C:\Program Files\PowerShell\7;C:\WINDOWS…
スクリプトが実行されるシステムでコンソールの幅が任意に設定される可能性があることを考慮すると、PowerShell が代わりに指定した幅に基づいてファイルにテーブル出力を書式設定することが望ましい場合があります。
Out-File
コマンドレットは Width パラメーターを指定し、テーブル出力に合った幅を設定できます。
-Width 2000
を呼び出すすべての場所に Out-File
を追加するのではなく、$PSDefaultParameterValues
変数を使用してスクリプト内の Out-File
コマンドレットのすべての使用に対してこの値を設定できます。 また、リダイレクト演算子 (>
と >>
) は事実上 Out-File
のエイリアスであるため、スクリプト全体で Out-File:Width
パラメーターを設定すると、リダイレクト演算子の書式幅にも影響します。 スクリプトの先頭付近に次のコマンドを記述し、スクリプト全体に Out-File:Width
を設定します。
$PSDefaultParameterValues['Out-File:Width'] = 2000
出力幅を広げると、表形式出力をログする場合のメモリ消費量が増加します。 多くの表形式データをファイルにログする場合に、幅を小さくすることでうまくいくことがわかっている場合は、幅を小さくしてください。
Get-Service
出力などの場合、余分な幅を使用するには、ファイルに出力する前に Format-Table -AutoSize
を通して出力をパイプ設定する必要があります。
$PSDefaultParameterValues['Out-File:Width'] = 2000
Get-Service | Format-Table -AutoSize > services.log
$PSDefaultParameterValues
の詳細については、「about_Preference_Variables」を参照してください。
比較演算子で考えられる混同
>
演算子は Greater-than 比較演算子 (他のプログラミング言語ではしばしば >
と表記されます) と混同しないでください。
比較するオブジェクトによっては、>
を使用する出力が正しく見えることがあります (36 は 42 より小さいため)。
PS> if (36 > 42) { "true" } else { "false" }
false
ただし、ローカル ファイルシステムを確認すると、42
というファイルが 36
という内容で書き込まれていることがわかります。
PS> dir
Mode LastWriteTime Length Name
---- ------------- ------ ----
------ 1/02/20 10:10 am 3 42
PS> cat 42
36
逆比較 <
(未満) を使用しようとすると、次のようなシステム エラーが発生します。
PS> if (36 < 42) { "true" } else { "false" }
ParserError:
Line |
1 | if (36 < 42) { "true" } else { "false" }
| ~
| The '<' operator is reserved for future use.
数値比較が必要な場合は -lt
と -gt
を使用する必要があります。 詳細については、「-gt
」の 演算子を参照してください。
関連項目
PowerShell