Write-Outputの使い方:オブジェクトをパイプラインに出力する
Write-Output コマンドレットを使用すると、オブジェクトをパイプラインに出力することができます。 PowerShell ではコマンドの実行結果は自動的に出力されますが、 Write-Output を使用することで明示的にオブジェクトを出力できます。出力されたオブジェクトは、パイプを経由して別のコマンドレットに渡すことができます。ここでは PowerShell における Write-Output コマンドレットの使い方について解説します。
Write-Outputコマンドレットの書式
Write-Output コマンドレットは、オブジェクトをパイプラインに出力するためのコマンドレットです。 Write-Output コマンドレットの書式は次の通りです。
Write-Output [-InputObject] <PSObject[]> [-NoEnumerate] [<CommonParameters>]
Write-Output はエイリアスとして echo、 writeが定義されています。
echo -> Write-Output write -> Write-Output
Write-Output は引数に指定したオブジェクトをパイプラインに出力しますが、 Write-Output がパイプラインの最後のコマンドである場合、オブジェクトは画面に表示されます。
※ PowerShell ではパイプラインの最後に残ったデータは、自動的に Out-Default に出力します。 Out-Default では適切な書式設定(フォーマット)などを行ったあとで画面に表示します。このため、パイプラインの最後に残ったオブジェクトは画面に表示されます。
Write-Output を使い、オブジェクトをパイプラインに出力することで画面にメッセージを表示するには次の書式を使用します。
Write-Output -InputObject オブジェクト
-InputObject は省略可能なので、通常は次のように実行します。
Write-Output オブジェクト
それでは、画面に "Hello" と表示します。次のように実行します。
Write-Output "Hello"
画面に "Hello" と表示されました。指定した文字列がそのまま画面に表示されます。
この値は画面に表示されるだけでなく、パイプラインにも出力されています。
※ 画面に出力する場合には Write-Host コマンドレットと同じように使用できますが、 Write-Output の場合には文字色/背景色を設定したり、区切り文字を設定したり、改行を行わずに出力することはできません。
変数に格納したオブジェクトを出力することもできます。次の例では Get-ChildItem コマンドレットの結果を変数に格納し、そのあとで Write-Output を使って変数に格納されたオブジェクトを出力しています。
$items = Get-ChildItem c:\code\powershell -Name Write-Output $items
画面に指定したパスのファイルとディレクトリが表示されました。
なお PowerShell ではコマンドの実行結果は自動的に出力されるため、次のように記述しても同じ結果になります。
Get-ChildItem c:\code\powershell -Name
コマンドを実行すると、コマンドの実行結果は自動的にパイプラインへ出力されます。先に記載したようにパイプラインの最後のコマンドである場合、オブジェクトは画面に表示されます。
オブジェクトをそのまま記述した場合も、 Write-Output と同じように実行結果をパイプラインに出力します。次のように記述した場合も、 Write-Output "Hello" と同じ結果になります。
"Hello"
画面に "Hello" と表示されました。指定した文字列がそのまま画面に表示されます。
パイプラインへ出力する
Write-Output で出力したオブジェクトは、パイプ(|)を使って他のコマンドレットに渡すことができます。
次の例ではパスを表す文字列を Write-Output を使って Get-ChildItem へ渡しています。
Write-Output "c:\code\powershell" | Get-ChildItem
画面に指定したパスのファイルとディレクトリが表示されました。
この場合、文字列として出力されたパスが Get-ChildItem の入力として渡され、対象のディレクトリとして処理されています。
※ Write-Host の場合は、結果をパイプラインに出力するのではなく画面に直接表示するため、パイプ(|)で他のコマンドレットに渡すことはできません。
Write-OutputとWrite-Hostとの違い
Write-Output と Write-Host はどちらも画面にメッセージを表示することができますが、動作が大きく異なります。
主な違いは次の通りです。
| 特長 | Write-Host | Write-Output |
|---|---|---|
| 目的 | メッセージの表示 | オブジェクトの出力 |
| 出力先 | コンソール(画面) | パイプライン(最終的に画面表示) |
| 結果の利用 | コマンドに渡せない | コマンドに渡せる |
| 画面の装飾 | 文字色や背景色の設定 | 装飾の設定はできない |
Write-Output はオブジェクトをパイプラインへ出力することを目的としており、パイプ(|)を通して他のコマンドレットにオブジェクトを渡すことができます。それに対して Write-Host は画面表示を目的としており、結果の装飾などをする機能がありますが、他のコマンドレットにオブジェクトを渡すことはできません。
Write-Outputの場合
Write-Output では、コマンドの実行結果をパイプラインへ出力します。そのため、パイプを通して別のコマンドラインへオブジェクトを渡すことができます。
次の例では、 Write-Output で出力した文字列を Get-Member に渡しています。
Write-Output "Hello" | Get-Member
このように、出力されたオブジェクトは他のコマンドレットで処理することができます。
なお Write-Output がパイプラインの最後だった場合、オブジェクトは画面に表示されます。
次の例では、 Write-Output を他のコマンドなどに渡していないため、画面にオブジェクトが表示されます。
Write-Output "Hello"
Write-Hostの場合
Write-Host は画面にメッセージを表示するために使用します。画面に直接表示するため、パイプラインを通して他のコマンドに結果を渡すことはできません。
例えば次のように Write-Host を使用しても、パイプラインに出力されないため、次のコマンドレットに渡すことができません。
Write-Host "Hello" | Get-Member
この場合、 Write-Host はパイプラインに出力しないため、 Get-Member は入力を受け取ることができず、何も処理できません。
Write-Host は画面にメッセージを表示するのが目的であり、文字色や背景色を変更する機能が用意されています。
Write-Host "Hello" -ForegroundColor Blue
Write-Output と Write-Host の違いについて簡単に説明しました。似たコマンドですが、役割は大きく異なります。データを処理する場合は Write-Output、ユーザーへのメッセージ表示には Write-Host を使用するようにしてください。
※ Write-Host の使い方については「Write-Hostの使い方:画面にメッセージを表示する」を参照されてください。
関数の戻り値に利用する
PowerShell の関数では呼び出し元に戻り値を返すことができます。戻り値は return を使って明示的に指定することもできますが、その他にも関数内で出力を行った場合は戻り値として扱われるルールがあります。
その為、関数の最後で Write-Output を使ってオブジェクトを出力することで、関数の戻り値として呼び出し元に返すことができます。
下記は 2 つの引数を受け取って、加算した結果を返す関数です。関数の最後で Write-Output を使ってオブジェクトを出力しており、その出力結果が戻り値として呼び出し元に返されます。
function Get-Sum ($a, $b) {
$sum = $a + $b
Write-Output $sum # 戻り値を返す
}
$result = Get-Sum 10 8
Write-Host $result # 計算結果を画面表示
実行すると、加算した結果が画面に表示されます。
なお今回の例では戻り値を返すときに Write-Output $sum と記述していますが、単に $sum と記述しても同じように出力されるため結果は同じになります。
PowerShell では、関数内で出力されたオブジェクトはすべて戻り値として扱われます。そのため、 Write-Output を使用しなくても、値をそのまま記述するだけで戻り値として返されます。
function Get-Sum ($a, $b) {
$sum = $a + $b
$sum # 戻り値を返す
}
ただ、この場合は戻り値として出力しているのか、単に値を表示しているのかが分かりにくくなります。 Write-Output を使って出力をおこなうことで、戻り値を返すための処理を行っていることが分かりやすいです。
※ return を使っても戻り値を返せますが、 return を使用すると、その時点で関数の処理は終了します。一方で Write-Output を使った場合は、処理を継続したまま値を出力できます。
※ PowerShell では、関数内で複数の値を出力した場合、それらすべてが戻り値として配列で返されます。そのため、関数内で複数回出力を行うと、それらの値が順番に戻り値としてまとめて返されます。
-- --
PowerShell における Write-Output コマンドレットの使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。