書き込みホストと書き込み出力のPowerShellの違いは?


回答:


83

一言で言えば、Write-Hostコンソール自体に書き込みます。VBScriptのMsgBoxと考えてください。Write-Output一方、パイプラインに書き込むため、次のコマンドはそれを入力として受け入れることができます。暗黙的に呼び出されるためWrite-Output、オブジェクトを作成するために使用する必要はありませWrite-Outputん。

PS> Get-Service

と同じになります:

PS> Get-Service | Write-Output

16
Powershellは、このように非常に混乱しています。このリンクを読んで、PowerShellで言及されているピップラインの感触と、関数から値が返される方法を理解することをお勧めします。「PowerShellのreturnキーワードは誤解を招く恐れがあります。正直なところ、ほとんどのプログラミング言語のようにまったく機能しないため、避けています。」- powershell.org/forums/topic/...
ジムアホ

1
戻り値のある関数を呼び出す場合は、その関数でWrite-Outputを使用しないでください。使用すると、戻り値の代わりにその文字列が返されます。これはあらゆる種類の大混乱を引き起こす可能性があります。
Brain20 0019

29

Write-Outputは、出力をパイプラインに送信します。そこから、別のコマンドレットにパイプしたり、変数に割り当てたりすることができます。Write-Hostはそれをコンソールに直接送信します。

$a = 'Testing Write-OutPut'  | Write-Output
$b = 'Testing Write-Host' | Write-Host

Get-Variable a,b

出力:

Testing Write-Host

Name                           Value                                                                 
----                           -----                                                                 
a                              Testing Write-OutPut                                                  
b                                                  

パイプラインへの出力を変数に割り当てるか、別のコマンドにパイプすることによってPowershellに出力を処理するように指示しない場合、出力はデフォルト外に送信されます。通常はコンソールであるため、最終結果は同じように表示されます。 。


9

Write-Outputパイプラインを介してオブジェクトとしてデータを送信します。質問の例では、文字列を渡すだけです。

write-hostホストに依存します。コンソールでwrite-hostは基本的にを行ってい[console]::WriteLineます。詳細については、こちらをご覧ください。


4
将来の読者のために明確にするためだけに。Write-Ouputオブジェクトを送信します。今回は文字列でしたが、通常はオブジェクトを送信し、結果/データを出力するデフォルトの方法であるため、通常は使用する必要はありません:)
Frode F.

5

Write-HostとWrite-Outputのもう1つの違い:

  • Write-Hostは画面にメッセージを表示しますが、ログには書き込みません

  • Write-Outputはメッセージをログに書き込みますが、画面には表示されません。

そして、Write-Hostは有害であると見なされます。詳細な説明は、「有害と見なされる書き込みホスト」にあります。


2
書き込み出力ははるかに有害だと思います。関数が実際に期待される結果を返し、コマンドからの予期しないガベージ出力がないことをどのように確認していますか?
MKesper 2016年

6
Write-Outputスクリプトを自分で実行している場合は、画面にメッセージが表示されると思います。そのため、「Write-Outputはメッセージをログに書き込みますが、画面には表示されません」という意味がわかりません。?
ジム・アホ

変数への出力をキャプチャする関数内で使用されている場合、書き込み出力で画面に情報を返すことはできません。それは出力を台無しにするかもしれません。これには、Write-Hostの方が適しています。
galmok

@Summer Write-Outputは有害であり、Write-Informationは素晴らしいです。書き込み出力は、戻り値を持つPowershell関数の敵です。
Brain20 0019

ドキュメントよると、「Windows PowerShell 5.0以降、Write-HostはWrite-Informationのラッパーです。これにより、Write-Hostを使用して情報ストリームに出力を出力できます。」
Phistrom

0

以下の例で、2つのコマンドの違いを理解できます。

書き込みホスト "msgtxt" | Get-Service上記を実行すると、「msgtxt」として出力されます。

書き込み出力 "msgtxt" | Get-Service上記を実行すると、msgtxtはサービスの名前ではないため、エラーが発生します。(理想的な状態)(パイプラインに書き込んでいて、Get-Serviceへの入力として渡されているため)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.