出力のリダイレクト

PowerShell には、データ出力を直接制御できるようにするコマンドレットがいくつかあります。 これらのコマンドレットには、2 つの重要な特性があります。

まず、これらのコマンドレットは、通常、データをいくつかの形式のテキストに変換します。 コマンドレットは、テキスト入力を必要とするシステム コンポーネントにデータを出力するので、変換を実行します。 これは、コマンドレットがオブジェクトを文字列として表現する必要があることを意味します。 したがって、テキストは PowerShell のコンソール ウィンドウに表示される形式に書式設定されます。

2 番目に、これらのコマンドレットは、PowerShell から他の場所に情報を送信するために、PowerShell の動詞 Out を使用します。

コンソール出力

既定では、PowerShell は、データをホスト ウィンドウに送信します。実際にそのことを実行するのが Out-Host コマンドレットです。 Out-Host コマンドレットは主な用途はページングです。 たとえば、次のコマンドは、Out-Host を使用して Get-Command コマンドレットの出力をページングします。

Get-Command | Out-Host -Paging

ホスト ウィンドウ表示は、PowerShell の外部で行われます。 これは、PowerShell の外部にデータが送信されるときに、データが実際に削除されるので、重要です。 ホスト ウィンドウにデータをページングするパイプラインを作成しようとする場合に、これが発生します。次に示すように、リストとして書式設定を試みます。

Get-Process | Out-Host -Paging | Format-List

リスト形式で処理情報のページを表示するコマンドと思ったかもしれません。 そうではなく、既定の表形式のリストが表示されます。

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    101       5     1076       3316    32     0.05   2888 alg
...
    618      18    39348      51108   143   211.20    740 explorer
    257       8     9752      16828    79     3.02   2560 explorer
...
<SPACE> next page; <CR> next line; Q quit
...

Out-Host コマンドレットは、データを直接にコンソールに送信します。したがって、Format-List コマンドは、書式を設定するものを何も受け取りません。

このコマンドを構築する正しい方法は、次に示すように、Out-Host コマンドレットをパイプラインの最後に置くことです。 これによって、データがページングされて表示される前に、リスト形式に書式設定するよう処理されます。

Get-Process | Format-List | Out-Host -Paging
Id      : 2888
Handles : 101
CPU     : 0.046875
Name    : alg
...

Id      : 740
Handles : 612
CPU     : 211.703125
Name    : explorer

Id      : 2560
Handles : 257
CPU     : 3.015625
Name    : explorer
...
<SPACE> next page; <CR> next line; Q quit
...

これは、すべての Out コマンドレットに適用されます。 Out コマンドレットは、常にパイプラインの末尾に置く必要があります。

注意

すべての Out コマンドレットは、コンソール ウィンドウに有効な書式設定 (行の長さの制限を含む) を使用して、テキストとして出力を表示します。

出力の破棄

Out-Null コマンドレットは、受け取ったすべての入力を直ちに破棄するよう設計されています。 これは、コマンドを実行する副作用として受け取る不要なデータを破棄するのに便利です。 次のコマンドを入力すると、コマンドからは何も返ってきません。

Get-Command | Out-Null

Out-Null コマンドレットは、エラー出力を破棄しません。 たとえば、次のようにコマンドを入力すると、PowerShell が Is-NotACommand を認識しないことを通知するメッセージが表示されます。

PS> Get-Command Is-NotACommand | Out-Null
Get-Command : 'Is-NotACommand' isn't recognized as a cmdlet, function, operable program, or script file.
At line:1 char:12
+ Get-Command  <<<< Is-NotACommand | Out-Null

データの印刷

Out-Printer は Windows プラットフォーム上でのみ使用できます。

Out-Printer コマンドレットを使ってデータを印刷できます。 プリンター名を指定しない場合、Out-Printer コマンドレットは通常使うプリンターを使います。 任意の Windows ベースのプリンターを、その表示名を指定して使用できます。 どんな種類のプリンター ポートのマッピングも (実際の物理プリンターの場合でも) 必要ありません。 たとえば、Microsoft Office 文書のイメージング ツールがインストールされている場合、次のように入力して、データをイメージ ファイルに送信できます。

Get-Command Get-Command | Out-Printer -Name 'Microsoft Office Document Image Writer'

データの保存

Out-File コマンドレットを使用して、出力をコンソール ウィンドウにではなく、ファイルに送信することができます。 次のコマンド ラインは、プロセスの一覧をファイル C:\temp\processlist.txt に送信します。

Get-Process | Out-File -FilePath C:\temp\processlist.txt

従来の出力のリダイレクトを使用している場合、Out-File コマンドレットを使用した結果は、期待どおりではないことがあります。 その動作を理解するために、Out-File コマンドレット操作のコンテキストを把握しておく必要があります。

Window PowerShell 5.1 上で Out-File コマンドレットを使うと、Unicode ファイルが作成されます。 ASCII ファイルを想定する一部のツールは、既定の出力形式では正しく機能しません。 Encoding パラメーターを使用して、既定の出力フォーマットを ASCII 形式に変更することができます。

Get-Process | Out-File -FilePath C:\temp\processlist.txt -Encoding ASCII

Out-file は、ファイルの内容をコンソール出力に表示されるように書式設定します。 これによって、ほとんどの状況で、コンソール ウィンドウ内に表示されるのと同じように、出力は切り捨てられます。 たとえば、次のようにコマンドを実行します。

Get-Command | Out-File -FilePath c:\temp\output.txt

出力は次のようになります。

CommandType     Name                            Definition
-----------     ----                            ----------
Cmdlet          Add-Content                     Add-Content [-Path] <String[...
Cmdlet          Add-History                     Add-History [[-InputObject] ...
...

行の折り返しを画面の幅に合わせないで出力するには、Width パラメーターを使用して行の幅を指定します。 Width が 32 ビットの整数パラメーターであるため、最大値は 2147483647 です。 行の幅に、この最大値を設定するには、次のように入力します。

Get-Command | Out-File -FilePath c:\temp\output.txt -Width 2147483647

Out-File コマンドレットは、ちょうどコンソールに表示されるように出力を保存する場合、最も役立ちます。