実際、私はPowerShellを学習しだしてからこの点を意識するのにしばらく時間がかかりました... 正確な話をすると、PowerShell 5.0からWrite-Hostの結果がInformation streamに出力される様になっていますが、本エントリではわかりやすさのためにその点にはあえて触れません, 例えばOut-GridViewにFormat-*したデータを渡すとエラーになります。. PowerShell エンジンの機能強化 編. PowerShellの基本的なことがわかってなかったシリーズ第8弾でもあります。, Google等でWrite-Host Write-Output 違いなワードで検索すると非常にアレな感じだったのでもう少しまともにしたいというのが動機です。, 私自身PowerShell勉強中の身なので大したことは書けませんが、それでもすこしは現状をマシにできると思っています。(本当はもっと詳しい人にこのエントリを書いてもらった方がうれしいのですが...), Write-HostとWrite-Outputの違いについて触れるまえにPowerShellの重要な基本に触れる必要があります。 Write-Hostを実行してもStandard output streamへの出力はありません。*3 そのコマンドがパイプラインの最後のコマンドである場合、オブジェクトはコンソールに表示されます。, Write-Output は、"出力ストリーム" や "正常終了パイプライン" とも呼ばれるプライマリ パイプラインにオブジェクトを送信します。 ファイルには出力させたくないので、Nullにリダイレクトしてそれをさ … Command > $ {NULL} 2 > & 1 . PowerShell. ここでいう"ホスト"はPowerShellの実行環境(PowerShellコンソールやPowerShell ISE等)であり、ホスト≒コンソールと考えて差し支えありません。, Write-Hostはコンソールに文字を表示させるだけのコマンドレットです。 PowerShellのストリームの詳細については以下のエントリをご覧ください。, Format-*によってオブジェクトがどういう書式をとるかについては牟田口先生の以下のエントリをご覧ください。, Write-HostとWrite-Outputの表示のされ方の違いについては以下のエントリをご覧ください。, Write-Output自体について補足を追記しましたので以下のエントリもよければご覧下さい。. 1月 29, 2018. Write-HostとWrite-Outputの違い、PowerShellのフォーマットと出力の基本についてわかる範囲で書きました。 Standard output Streamに出力されているので結果を変数に設定することができます。, そして、重要なことなのですが、Write-Output自体はコンソールへの表示を行う機能は持っていません。, そのコマンドがパイプラインの最後のコマンドである場合、オブジェクトはコンソールに表示されます。, とある様に、パイプラインの最後*4でWrite-Outputを実行すると最終的にはコンソールにオブジェクトに応じた文字列が表示されます。 それは、, これがどう重要かというと、コマンドプロンプト(cmd.exe)やbash等のUnix系シェルはテキストベースのシェルであり、標準・エラー出力に出力されるテキストとコンソール表示される内容は基本的に同一となります。*1, 対してPowerShellでは標準・エラー出力に相当するStandard output stream(1>)・Error output stream(2>)にはオブジェクトが出力され、最終的にコンソールにはオブジェクト毎に定められた書式のテキストが表示されます。, これは、PowerShellに慣れている人にとっては当たり前に感じると思いますが、慣れてない人にとっては意外と意識されていない様に見受けられます。*2, この基本を踏まえてWrite-HostとWrite-Outputの違いについて触れていきます。 PowerShellの2>$1(エラー出力を標準出力に表示させない)正しい書き方 . PowerShellで毎日いじられてます。 悔しいことが多いのがアレですが、負けません。 さて、今回は最近はやり?のbashネタです。 某LINQ星人にPowerShell 3.0ならできるはず!と言われ、初めて気付き大変不覚の致すところです。 では早速。 tail … 1. もちろんFormat-*を明示した場合はFormat-Defaultは呼び出されません。. こちらについて詳細は後述します。, このため、表示を目的としたWrite-Hostでは-ForegroundColorや-BackgroundColorによる色指定や、-NoNewlineによる改行の有無を指定できるものの結果を変数に設定することができず、出力を目的としたWrite-Outputでは結果を変数に設定できますがWrite-Hostの様なパラメーターはありません。, 単純に利用する分には似た動作に見えるWrite-HostとWrite-Outputですが、その実全くの別物であることがわかります。, ここからは補足的な内容となり、若干PowerShellのコアな部分について触れていきます。, Write-Outputにはコンソールに文字を表示する機能がないにもかかわらず最終的にはコンソールに文字列が出力されます。, この記事を読んでもらえば私から説明することは無い気もしますが、かいつまんで説明していきます。, 上記の原則によれば、オブジェクトをコンソールに表示するにはOut-Hostコマンドレットを呼び出す必要がありますが、実際には呼び出さなくてもコンソールに文字列が表示されるのは前述のとおりです。, これは、明示的にOut-*を呼ばない場合は既定の出力Out-Defaultが暗黙的に呼ばれているためです。, Out-Defaultとは一体何なのか?というと、私もまだ勉強中でわからない部分が非常に多いです。   PowerShellでtail -fを再現する . 極力間違いのない様にしていますが、現在進行形で調査中な部分もあり正直自信の無い部分もあります。, 以下に本エントリの内容に関連する補足資料を挙げます。 エラーを標準出力に表示させたくないコマンドで有名な 2>&1 ですが、ちょっと癖があったのでメモ。 2>&1はこう書く. 問題点 Powershell では一部のコマンドの結果は省略されて表示される場合があります。細かく知りたい場合はcvsに出力すれば省略されませんが、ちょっと見たい場合でも毎回 csv に出力してから表示するのは余計な作業が発生します。 では、Format-*についてもOut-*と同様に暗黙的にFormat-Defaultが呼ばれているのかというと、どうやら違う様です。, こちらについては、参考となるドキュメントは無かったのですがTrace-Commandコマンドレットを使い以下のコードを試してみたところ、, といった結果が表示され、Out-*コマンドレット内部で既定のフォーマットを行うFormat-Defaultが呼び出されることがわかりました。 出力の型がSystem.Management.Automation.PSObjectになっており、文字列に限らずあらゆるオブジェクトを扱います。 *2:実際、私はPowerShellを学習しだしてからこの点を意識するのにしばらく時間がかかりました... *3:正確な話をすると、PowerShell 5.0からWrite-Hostの結果がInformation streamに出力される様になっていますが、本エントリではわかりやすさのためにその点にはあえて触れません, *5:例えばOut-GridViewにFormat-*したデータを渡すとエラーになります。. まずは各コマンドレットがどういうものかについて説明します。, となっています。 2013-04-15. PowerShell 5.0の環境でILSpyでOut-Defaultの実装を見た限りだとOut-Hostとは別実装になっており、この辺の仕組みも記事公開時から変わっているっぽいです... PowerShell Core 6.1で導入されるMarkdown関連機能について, WMF 5.1の新機能をざっくり説明する - 4. エラー オブジェクトをエラー パイプラインを送信するには、Write-Error を使用します。, Write-Outputは、Standard output stream(="出力ストリーム")に指定のオブジェクトを出力するコマンドレットです。