[ホーム] > [間違えやすい類語 IT編一覧] > [Write-Host、Write-Output 、echo の使い分けはとても重要]

Write-Host、Write-Output 、echo の使い分けはとても重要

作成日:2020/01/29

文字出力の違い


このページでは Windows Powershell において文字を出力する関数であるWrite-Host、Write-Output 、echoの違いに関して説明します。一見どれも標準出力に出力するため違いがないような気がしますが、関数内で実行した場合には大きな違いが発生しますので、使用する場合は注意が必要です。

write-hostはコンソールに出力します。write-output はパイプで次の処理に渡します。もし処理が省略されている場合はOut-defaultによりコンソールに出力されます。

write-host と write-output



よってOut-null に対して write-hostは出力が捨てられませんが、write-outpu は出力が捨てられます。

write-hostはコンソールへ出力するため、パイプ処理に渡されない。

PS C:\> write-host "test" | Out-Null
test



write-output はパイプ処理により次の処理に渡される。よってOut-Nullで捨てられる。

PS C:\> write-output "test" | Out-Null



戻り値


関数内でWrite-Output や echo を使用すると標準出力への出力ではなく、戻り値として設定されてしまうようです。よって標準出力への出力を行う場合は、Write-Hostを使うべきです。

リダイレクト


ファイルへリダイレクトする場合は注意が必要です。Write-host は直接標準出力に書き込むため、ファイルへのリダイレクトはできません。要するに以下のようなコードではファイルへは出力されません。

write-host > test.txt

リダイレクトしたい場合は 以下のようなコマンドを実行します。

write-output > test.txt

(注意)分かりやすく簡単に記載しており、一部の環境や分野では記載内容が異なる可能性があります。あくまでも参考程度でお読みください。

比較表

比較は以下の表の通りとなります。

説明Write-HostWrite-Output echo
機能コンソールに直接書き込む。よってパイプラインで処理したりファイルへリダイレクトすることはできない。
出力ストリームに書き込む。よってパイプラインで渡したりファイルへリダイレクトすることが可能。
Write-Output のエイリアス。write も同じ。
コンソール上で実行コンソールに出力される。
コンソールに出力される。(パイプライン処理で最後の処理が指定されない場合、デフォルト(Out-Default)がコンソール出力のため)
コンソールに出力される。
関数(ファンクション)内で実行コンソールに出力される。
戻り値に設定される。
戻り値に設定される。
機能文字をコンソールに出力する。
文字を標準出力へ出力する。もし Write-Output がパイプラインの最後の場合は、コンソールへ出力される。
Write-Output と同じ。
Start-Transcriptでのファイルへ出力出力される (古いバージョンのPowershellではファイルに出力されない不具合があった)
出力される出力される
関数(ファンクション)内での実行例> $x = Write-Host "123"
123
> echo $x
(なし)

#上記の通り、単に標準出力に出力するだけで関数には影響を与えない。
>$x = Write-Output "123"
>Write-Host $x
123

#上記の通り、Write-Outputは関数の戻り値に設定される。
>$x = echo "123"
> Write-Host $x
123

#上記の通り、echo は関数の戻り値に設定される。
実行図




(実は)echo は Write-Output の エイリアスです。同じものです。writeも同じです。以下のコマンドで alias を確認することが可能です。


PS> Get-Alias echo
CommandType Name Version Source
----------- ---- ------- ------
Alias echo -> Write-Output

PS> Get-Alias write
CommandType Name Version Source
----------- ---- ------- ------
Alias write -> Write-Output



Workflow 内での動作


Workflow からの他 ps1 ファイル(Bと呼ぶ)を呼び出した場合、B で Write-OutputしてもStart-Transcript でファイルに記録されないという現象が発生した。(Write-Hostsでは出力される。)同じく BでWrite-Output がコンソールでも出力されないという不具合が発生した。原因は調査中。


[ホーム] > [間違えやすい類語 IT編一覧]
,







【注意】本ページは著作権で保護されています。内容は何人も補償しません。時間的あるいは金銭的損失等、一切保証しません。

理解しやすく記載されており、一部不正確な記載がある可能性があります。ご自身の責任で参考にしてください。