Windows PowerShell には、データの出力を直接制御するためのコマンドレットがいくつか用意されています。これらのコマンドレットには、共通する 2 つの重要な特性があります。

1 つ目は、多くの場合、データがテキスト形式に変換されるという点です。これは、テキスト入力を受け取るシステム コンポーネントに対してデータが出力されるためです。このことは、オブジェクトをテキストとして表現する必要があることを意味します。そのため、Windows PowerShell のコンソール ウィンドウに表示されるようなテキスト形式に変換されます。

2 つ目は、情報が Windows PowerShell から、どこか別の場所に送信されるという意味で、これらのコマンドレットには Out という動詞が使用される点です。Out-Host コマンドレットも例外ではありません。つまり、ホスト ウィンドウの表示は、Windows PowerShell の外部で行われています。このことは重要です。なぜなら Windows PowerShell の外部に送られたデータは、実際には削除されるためです。これは、データをページ単位でホスト ウィンドウに送るパイプラインを作成し、リスト形式で表示してみると確認できます。

PS> 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 コマンドレットをパイプラインの最後に配置する必要があります。これにより、処理対象のデータがリスト形式に書式化された後、ページ単位に分割されて表示されます。

PS> 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-Host)

既定では、Out-Host コマンドレットの場合と同様、Windows PowerShell によって、データがホスト ウィンドウに送られます。前述のように、Out-Host コマンドレットの主な用途は、データをページ単位に分割することです。たとえば、次のコマンドでは、Out-Host を使用して、Get-Command コマンドレットの出力をページ単位に分割します。

PS> Get-Command | Out-Host -Paging

more 関数を使用して、データをページ単位に分割することもできます。Windows PowerShell の more は、Out-Host -Paging を呼び出す関数です。次のコマンドは、more 関数を使用して、Get-Command の出力をページ単位に分割する例です。

PS> Get-Command | more

more 関数の引数にファイル名 (複数可) を指定すると、指定されたファイルが読み込まれ、その内容がページ単位でホストに送られます。

PS> more c:\boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
...

出力の破棄 (Out-Null)

Out-Null は、受け取った入力を即座にすべて破棄するためのコマンドレットです。コマンドの実行に伴って生じた不要なデータを破棄する場合に使用します。次のコマンドを入力した場合、このコマンドからは何も返されません。

PS> Get-Command | Out-Null

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

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

データの印刷 (Out-Printer)

データを印刷するには、Out-Printer コマンドレットを使用します。Out-Printer コマンドレットでは、プリンター名を指定しなかった場合、既定のプリンターが使用されます。Windows ベースのプリンターを使用するには、対応する表示名を指定します。プリンター ポートの割り当ては不要です。また、プリンターそのものがなくても使用できます。たとえば、Microsoft Office Document Imaging ツールがインストールされている場合は、次のように入力すると、データをイメージ ファイルに送ることができます。

PS> Get-Command Get-Command | Out-Printer -Name "Microsoft Office Document Image Writer"

データの保存 (Out-File)

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

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

従来の出力リダイレクトと同じ感覚で Out-File コマンドレットを使用すると、思うような結果が得られない場合があります。この動作を理解するには、Out-File コマンドレットを実行するコンテキストに注意する必要があります。

既定では、Out-File コマンドレットによって作成されるファイルは Unicode ファイルです。将来性を考えると最適な設定ですが、既定の出力形式では、ASCII ファイルを想定したツールが正しく動作しないことになります。既定の出力形式を ASCII に変更するには、Encoding パラメーターを使用します。

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

Out-file では、ファイルの内容が、コンソール出力と同じように書式設定されます。そのため、ほとんどの場合、出力はコンソール ウィンドウとまったく同じように切り詰められます。たとえば、次のコマンドを実行したとします。

PS> 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 コマンドレットは、コンソールでの表示と同じように、出力を保存する場合に最適です。出力形式をより細かく制御するには、さらに高度なツールが必要です。この点については、次の章で、オブジェクトの操作に関する説明と併せて取り上げます。




目次