about_Redirection

簡単な説明

PowerShell からテキスト ファイルに出力をリダイレクトする方法について説明します。

詳細な説明

既定では、PowerShell は出力を PowerShell ホストに送信します。 通常、これはコンソール アプリケーションです。 ただし、出力をテキスト ファイルにリダイレクトしたり、エラー出力を通常の出力ストリームにリダイレクトしたりすることができます。

出力のリダイレクトには次のような方法を使用できます。

  • コマンド出力をテキスト ファイルに送信する Out-File コマンドレットを使用します。 通常、Out-File コマンドレットは、EncodingForceWidth、または NoClobber パラメーターなどのパラメーターを使用する必要がある場合に使用します。

  • コマンド出力をテキスト ファイルに送信し、その後パイプラインに送信する Tee-Object コマンドレットを使用します。

  • PowerShell リダイレクト演算子を使用します。 ファイル ターゲットでリダイレクト演算子を使用することは、追加のパラメーターなしで Out-File へのパイプ処理を行うことと機能的に同等です。

詳細については、「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 Description 構文
> 指定したストリームをファイルに送信します。 n>
>> 指定したストリームをファイルに追加します。 n>>
>&1 指定したストリームを成功ストリームにリダイレクトします。 n>&1

Note

いくつかの Unix シェルとは異なり、他のストリームを成功ストリームにリダイレクトするしかできません。

例 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-HostWrite-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'

このスクリプトを実行すると、$ErrorActionPreferenceInquire に設定されている場合にプロンプトが表示されます。

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

メモ

データを追加しないリダイレクト演算子 (>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 パラメーターを指定し、テーブル出力に合った幅を設定できます。 Out-File を呼び出すすべての場所に -Width 2000 を追加するのではなく、$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」を参照してください。

バイナリ データのリダイレクト

PowerShell は、バイナリ データのリダイレクトをサポートしていません。 バイトストリーム データをリダイレクトすると、PowerShell ではそのデータが文字列として扱われます。 こうしたリダイレクトを行うと、データが破損します。

比較演算子で考えられる混同

> 演算子は 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" }
At line:1 char:8
+ if (36 < 42) { "true" } else { "false" }
+        ~
The '<' operator is reserved for future use.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : RedirectionNotSupported

数値比較が必要な場合は -lt-gt を使用する必要があります。 詳細については、「about_Comparison_Operators」の -gt 演算子を参照してください。

関連項目