はじめに:なぜログに出ないの?と混乱した話
PowerShellでスクリプトを書き始めたとき、多くの人が同じ疑問を持ちます。
「画面には表示されたのに、ログファイルに残らない」
前回の記事でTee-Objectを使ってログを出力したのに、なぜか一部のメッセージだけ保存されない。
私も運用現場でこれに何度も悩みました。
原因のほとんどは、Write-HostとWrite-Outputの違いを知らないことです。
この2つは見た目は似ていますが、役割がまったく違います。
ここを理解すると、PowerShellの仕組みが一気にクリアになります。
まず結論:目的がまったく違います
最初にシンプルに整理します。
- Write-Output → データを「パイプライン」に流す
- Write-Host → 文字を「画面に直接表示する」
つまり、Write-Outputは「処理用の出力」、Write-Hostは「見せるための表示」です。
ここを区別せずに使うと、ログ出力やTee-Objectで混乱します。
Write-Outputの正体をやさしく解説
Write-Outputは、PowerShellの標準出力ストリーム(成功出力)にデータを流します。
この出力は、パイプ(|)で次のコマンドに渡すことができます。
例
Write-Output "Hello"
これは実は次と同じ意味です。
"Hello"
PowerShellでは、値をそのまま書くだけでも出力になります。
そしてこの出力は、Tee-Objectでログに保存できます。
Write-Output "Test Message" | Tee-Object -FilePath .\log.txt
この場合、画面にも出て、log.txtにも保存されます。
なぜなら、パイプラインに流れているからです。
Write-Hostの正体をやさしく解説
Write-Hostは、PowerShellの「ホスト(画面)」に直接文字を書き込みます。
つまり、パイプラインを通りません。
例
Write-Host "Hello"
見た目は同じですが、これはパイプで渡せません。
Write-Host "Test" | Tee-Object -FilePath .\log.txt
この場合、画面には出ますが、log.txtには保存されません。
なぜなら、Write-Hostはパイプラインに流れないからです。
ここが初心者がつまずく最大ポイントです。
なぜこんな設計になっているのか?
PowerShellは「オブジェクトを処理するシェル」です。
本来は、データをパイプでつなぎながら処理する設計です。
Write-Outputはその思想に沿っています。
一方、Write-Hostは「ユーザーに見せる専用」です。
色を付けたり、進捗メッセージを表示したりする用途です。
つまり、役割分担がはっきりしています。
ログ出力との関係
前回の記事の内容とつなげます。
Tee-ObjectやOut-Fileでログを残したい場合は、Write-Outputを使う必要があります。
もしWrite-Hostを使っていると、ログに残らない可能性が高いです。
おすすめの書き方
function Write-Log {
param(
[string]$Message
)
$Message | Tee-Object -FilePath .\run.log -Append
}
このように、パイプラインを意識して書くと安定します。
実務での正しい使い分け
運用現場では、次のように使い分けています。
- 処理結果やデータ → Write-Output
- ユーザー向けメッセージ → Write-Host
- ログに必ず残したい内容 → Write-Output
最近のPowerShellでは、Write-HostもInformationストリームを使う設計になっていますが、基本思想は変わりません。
ログを残したいなら、まずWrite-Outputを選ぶ。これが安全です。
まとめ
Write-HostとWrite-Outputの違いは、見た目では分かりません。
しかし内部では、まったく違う道を通っています。
ログ出力がうまくいかないときは、「パイプラインを通っているか?」を確認するのがコツです。
PowerShellは黒い画面の魔法ではありません。仕組みを理解すれば、必ず安定します。
次は、PowerShellの「出力ストリーム」そのものを深掘りすると、さらに理解が進みます。
免責規定
この記事で提供される情報は、一般的なガイダンスを目的としており、すべての環境やシステムでの動作を保証するものではありません。
OSのバージョンやリリースによっては、記載されている事が実行できない、または異なる結果をもたらす可能性があります。
また、会社所有のパソコン、スマホ、タブレットなどでは、ポリシーや権限によって実行できない場合があります。
この記事の情報を使用することによって生じる問題や結果について、筆者およびサイト管理者は責任を負いません。
すべての操作は自己責任で行ってください。
もし、記事の中で間違いやご指摘があればコメントを頂けると大変ありがたいです。
最後までお読みいただきありがとうございました。
またお会いしましょう!

コメント