about_Redirection

簡単な説明

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

長い説明

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

次のメソッドを使用して出力をリダイレクトできます。

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

  • コマンド出力を 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
* すべてのストリーム PowerShell 3.0

PowerShell には Progress ストリームもありますが、リダイレクトはサポートされていません。

重要

成功ストリームとエラー ストリームは、他のシェルの stdout ストリームと stderr ストリームに似ています。 ただし、入力のために stdin は PowerShell パイプラインに接続されていません。

PowerShell リダイレクト演算子

PowerShell リダイレクト演算子は次のとおりです。ここで n 、ストリーム番号を表します。 ストリームが指定されていない場合は、 成功 ストリーム ( 1 ) が既定値です。

演算子 説明 構文
> 指定したストリームをファイルに送信します。 n>
>> 指定したストリームをファイルに追加します。 n>>
>&1 指定したストリームを成功ストリームにリダイレクトします。 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: アクション環境設定の効果を表示する

アクション基本設定の変数とパラメーターは、特定のストリームに書き込まれる内容を変更できます。 この例のスクリプトは、値が $ErrorActionPreferenceError ストリームに書き込まれる内容にどのように影響するかを示しています。

$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
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

メモ

指定>n>したファイルの現在の内容を警告なしで上書きしないリダイレクト演算子。

ただし、ファイルが読み取り専用、非表示、またはシステム ファイルの場合、リダイレクト は失敗します。 追加リダイレクト演算子 (>> および n>>) は、読み取り専用ファイルに書き込むのではなく、システムまたは非表示のファイルにコンテンツを追加します。

読み取り専用、非表示、またはシステム ファイルへのコンテンツのリダイレクトを強制するには、コマンドレットとそのForceパラメーターをOut-File使用します。

ファイルに書き込む場合、リダイレクト演算子はエンコードを使用 UTF8NoBOM します。 ファイルのエンコードが異なる場合、出力が正しく書式設定されていない可能性があります。 別のエンコードを使用してファイルに書き込むには、コマンドレットとそのパラメーターをOut-FileEncoding使用します。

ファイルへの書き込み時の出力の幅

いずれかの 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

詳細については $PSDefaultParameterValuesabout_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.

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

こちらもご覧ください