about_Redirection
簡単な説明
PowerShell からテキスト ファイルに出力をリダイレクトする方法について説明します。
詳細な説明
既定では、PowerShell は出力を PowerShell ホストに送信します。 通常、これはコンソール アプリケーションです。 ただし、出力をテキスト ファイルにリダイレクトしたり、エラー出力を通常の出力ストリームにリダイレクトしたりすることができます。
出力のリダイレクトには次のような方法を使用できます。
コマンド出力をテキスト ファイルに送信する
Out-File
コマンドレットを使用します。 通常、Out-File
コマンドレットは、Encoding
、Force
、Width
、または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-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
メモ
データを追加しないリダイレクト演算子 (>
と 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
演算子を参照してください。
関連項目
PowerShell