Write-Outputの使い方:オブジェクトをパイプラインに出力する

広告

Write-Output コマンドレットを使用すると、オブジェクトをパイプラインに出力することができます。 PowerShell ではコマンドの実行結果は自動的に出力されますが、 Write-Output を使用することで明示的にオブジェクトを出力できます。出力されたオブジェクトは、パイプを経由して別のコマンドレットに渡すことができます。ここでは PowerShell における Write-Output コマンドレットの使い方について解説します。

Write-Outputコマンドレットの書式

Write-Output コマンドレットは、オブジェクトをパイプラインに出力するためのコマンドレットです。 Write-Output コマンドレットの書式は次の通りです。

Write-Output
  [-InputObject] <PSObject[]>
  [-NoEnumerate]
  [<CommonParameters>]

Write-Output はエイリアスとして echowriteが定義されています。

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-Outputコマンドレットの使い方(1)

この値は画面に表示されるだけでなく、パイプラインにも出力されています。

※ 画面に出力する場合には Write-Host コマンドレットと同じように使用できますが、 Write-Output の場合には文字色/背景色を設定したり、区切り文字を設定したり、改行を行わずに出力することはできません。

変数に格納したオブジェクトを出力することもできます。次の例では Get-ChildItem コマンドレットの結果を変数に格納し、そのあとで Write-Output を使って変数に格納されたオブジェクトを出力しています。

$items  = Get-ChildItem c:\code\powershell -Name
Write-Output $items

画面に指定したパスのファイルとディレクトリが表示されました。

Write-Outputコマンドレットの使い方(2)

なお PowerShell ではコマンドの実行結果は自動的に出力されるため、次のように記述しても同じ結果になります。

Get-ChildItem c:\code\powershell -Name

コマンドを実行すると、コマンドの実行結果は自動的にパイプラインへ出力されます。先に記載したようにパイプラインの最後のコマンドである場合、オブジェクトは画面に表示されます。

オブジェクトをそのまま記述した場合も、 Write-Output と同じように実行結果をパイプラインに出力します。次のように記述した場合も、 Write-Output "Hello" と同じ結果になります。

"Hello"

画面に "Hello" と表示されました。指定した文字列がそのまま画面に表示されます。

Write-Outputコマンドレットの使い方(3)

パイプラインへ出力する

Write-Output で出力したオブジェクトは、パイプ(|)を使って他のコマンドレットに渡すことができます。

次の例ではパスを表す文字列を Write-Output を使って Get-ChildItem へ渡しています。

Write-Output "c:\code\powershell" | Get-ChildItem

画面に指定したパスのファイルとディレクトリが表示されました。

Write-Outputコマンドレットの使い方(4)

この場合、文字列として出力されたパスが Get-ChildItem の入力として渡され、対象のディレクトリとして処理されています。

Write-Host の場合は、結果をパイプラインに出力するのではなく画面に直接表示するため、パイプ(|)で他のコマンドレットに渡すことはできません。

Write-OutputとWrite-Hostとの違い

Write-OutputWrite-Host はどちらも画面にメッセージを表示することができますが、動作が大きく異なります。

主な違いは次の通りです。

特長Write-HostWrite-Output
目的メッセージの表示オブジェクトの出力
出力先コンソール(画面)パイプライン(最終的に画面表示)
結果の利用コマンドに渡せないコマンドに渡せる
画面の装飾文字色や背景色の設定装飾の設定はできない

Write-Output はオブジェクトをパイプラインへ出力することを目的としており、パイプ(|)を通して他のコマンドレットにオブジェクトを渡すことができます。それに対して Write-Host は画面表示を目的としており、結果の装飾などをする機能がありますが、他のコマンドレットにオブジェクトを渡すことはできません。

Write-Outputの場合

Write-Output では、コマンドの実行結果をパイプラインへ出力します。そのため、パイプを通して別のコマンドラインへオブジェクトを渡すことができます。

次の例では、 Write-Output で出力した文字列を Get-Member に渡しています。

Write-Output "Hello" | Get-Member

Write-Outputコマンドレットの使い方(5)

このように、出力されたオブジェクトは他のコマンドレットで処理することができます。

なお Write-Output がパイプラインの最後だった場合、オブジェクトは画面に表示されます。

次の例では、 Write-Output を他のコマンドなどに渡していないため、画面にオブジェクトが表示されます。

Write-Output "Hello"

Write-Outputコマンドレットの使い方(6)

Write-Hostの場合

Write-Host は画面にメッセージを表示するために使用します。画面に直接表示するため、パイプラインを通して他のコマンドに結果を渡すことはできません。

例えば次のように Write-Host を使用しても、パイプラインに出力されないため、次のコマンドレットに渡すことができません。

Write-Host "Hello" | Get-Member

Write-Outputコマンドレットの使い方(7)

この場合、 Write-Host はパイプラインに出力しないため、 Get-Member は入力を受け取ることができず、何も処理できません。

Write-Host は画面にメッセージを表示するのが目的であり、文字色や背景色を変更する機能が用意されています。

Write-Host "Hello" -ForegroundColor Blue

Write-Outputコマンドレットの使い方(8)

Write-OutputWrite-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コマンドレットの使い方(9)

なお今回の例では戻り値を返すときに 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 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。