次の方法で共有


about_Redirection

簡単な説明

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

長い説明

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

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

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

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

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

ストリームの詳細については、「 about_Output_Streams」を参照してください。

リダイレクト可能な出力ストリーム

PowerShell では、次の出力ストリームのリダイレクトがサポートされています。

Stream# 説明 導入バージョン Write コマンドレット
1 成功Stream PowerShell 2.0 Write-Output
2 エラー Stream PowerShell 2.0 Write-Error
3 警告Stream PowerShell 3.0 Write-Warning
4 詳細Stream PowerShell 3.0 Write-Verbose
5 デバッグ Stream PowerShell 3.0 Write-Debug
6 情報Stream 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 して 、Error ストリームを Success ストリームにリダイレクトし > 、結果の Success ストリームを という名前のファイルに送信します。 dir.log

例 2: すべての成功ストリーム データをファイルに送信する

この例では、 すべての Success ストリーム データを という 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
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-FileForce使用します。

ファイルに書き込む場合、リダイレクト演算子はエンコードを使用 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

の詳細については $PSDefaultParameterValues、「 about_Preference_Variables」を参照してください。

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

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

比較演算子と混同する可能性がある

演算子は >より大きい 比較演算子 (多くの場合、他のプログラミング言語で示 > されます) と混同しないでください。

比較するオブジェクトによっては、 を使用 > する出力が正しいように見える場合があります (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 演算子に 関するページを参照してください。

関連項目