about_Redirection
簡単な説明
PowerShell からテキスト ファイルに出力をリダイレクトする方法について説明します。
長い説明
既定では、PowerShell は PowerShell ホストに出力を送信します。 通常、これはコンソール アプリケーションです。 ただし、出力をテキスト ファイルにリダイレクトしたり、エラー出力を通常の出力ストリームにリダイレクトしたりできます。
次のメソッドを使用して、出力をリダイレクトできます。
コマンド出力を
Out-File
テキスト ファイルに送信する コマンドレットを使用します。 通常、、、、Out-File
またはNoClobber
パラメーターなどのパラメーターを使用する必要がある場合は、 コマンドレットをForce
Encoding
Width
使用します。コマンド出力を
Tee-Object
テキスト ファイルに送信し、パイプラインに送信する コマンドレットを使用します。PowerShell リダイレクト演算子を使用します。 リダイレクト演算子をファイル ターゲットと共に使用することは、余分なパラメーターのない への
Out-File
パイプ処理と機能的に同じです。
ストリームの詳細については、「 about_Output_Streams」を参照してください。
リダイレクト可能な出力ストリーム
PowerShell では、次の出力ストリームのリダイレクトがサポートされています。
ストリーム# | 説明 | 導入バージョン | Write コマンドレット |
---|---|---|---|
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 | Write-Information , Write-Host |
* | すべてのストリーム | PowerShell 3.0 |
PowerShell には Progress ストリームもありますが、リダイレクトはサポートされていません。
重要
Success ストリームと Error ストリームは、他のシェルの stdout ストリームと stderr ストリームに似ています。 ただし、入力のために stdin は PowerShell パイプラインに接続されていません。
PowerShell リダイレクト演算子
PowerShell リダイレクト演算子は次のとおりです。ここで n
、ストリーム番号を表します。 成功ストリーム ( 1
) は、ストリームが指定されていない場合の既定値です。
演算子 | 説明 | 構文 |
---|---|---|
> |
指定したストリームをファイルに送信します。 | n> |
>> |
指定したストリームをファイルに追加します。 | n>> |
>&1 |
指定したストリームを Success ストリームにリダイレクトします。 | n>&1 |
注意
一部の Unix シェルとは異なり、他のストリームを Success ストリームにのみリダイレクトできます。
例
例 1: エラーと出力をファイルにリダイレクトする
この例では、成功する 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-Host "Hello"
Write-Information "Hello" -InformationAction Continue
} 6> $null
例 6: アクション環境設定の効果を表示する
アクション基本設定変数とパラメーターは、特定のストリームに書き込まれる内容を変更できます。 この例のスクリプトは、 の $ErrorActionPreference
値が Error ストリームに書き込まれる内容にどのように影響するかを示しています。
$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'
このスクリプトを実行すると、 が にInquire
設定されている場合にプロンプトが$ErrorActionPreference
表示されます。
PS C:\temp> .\test.ps1
Confirm
Cannot find path 'C:\not-here' because it does not 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
Notes
データ (>
および ) を追加しないリダイレクト演算子は、 n>
指定されたファイルの現在の内容を警告なしで上書きします。
ただし、ファイルが読み取り専用、非表示、またはシステム ファイルの場合、リダイレクト は失敗します。 追加リダイレクト演算子 (>>
と n>>
) は、読み取り専用ファイルには書き込まれませんが、システムまたは非表示のファイルにコンテンツを追加します。
コンテンツを読み取り専用、非表示、またはシステム ファイルに強制的にリダイレクトするには、 コマンドレットをパラメーターForce
と共にOut-File
使用します。
ファイルに書き込む場合、リダイレクト演算子はエンコードを使用 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」を参照してください。
比較演算子と混同する可能性がある
演算子は >
、 より大きい 比較演算子 (多くの場合、他のプログラミング言語で示されます >
) と混同しないでください。
比較するオブジェクトによっては、 を使用 >
する出力が正しいように見える場合があります (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
使用する必要があります。 詳細については、about_Comparison_Operatorsの -gt
演算子に 関するページを参照してください。