PowerShellでコンソールに書き込む最良の方法


142

コンソールに出力(エコー)するさまざまな方法について少し混乱しています。コンソールに出力を書き込むには、次のような複数の方法があることがわかりました。

Write-Host "Hello world1"
"Hello World2"
Out-Host -InputObject "Hello World3"

3つの方法すべてがコンソールに出力されます。真ん中のものは何とかしてシンプルで冗長ではなく、使いやすいです。また、次のような関数を作成すると、

function GetValues()
{
    "1"
    "2"
}

それでもパイプラインで2つの文字列を返します。

そして、私はまだ値を出力することができます:

foreach ($s in GetValues)
{
    Write-Host "s: " $s
}

私が見つけたのは、引用符で囲まれた文字列だけを使用すると、カスタムホストに常に表示されるわけではなく、カスタムホストで印刷する値を取得するためにWrite-Hostを使用する必要があったということです。

どういうわけか私はこれを混乱させます。の"Print something"エイリアスになることになっていますWrite-Hostか、またはその意図は何ですか?

回答:


101

PowerShellのデフォルトの動作は、別のパイプライン要素に拾われたり、変数に割り当てられたり(またはリダイレクトされたり)せずに、パイプラインから落ちるすべてのものをダンプすることOut-Hostです。何Out-Hostが行われるかは明らかにホストに依存します。

ホストアプリケーションでテキストを出力するという唯一の理由から、パイプラインから物事を外すだけでは代用できませんWrite-Host

出力が必要な場合は、Write-*コマンドレットを使用します。関数からの戻り値が必要な場合は、コマンドレットを使用せずにオブジェクトをダンプします。


1
これを.vbsスクリプトに入力しました。そのコード行だけでエラーが発生します。
FrenkyB 2014年

58

真ん中のものがパイプラインに書き込みます。Write-HostそしてOut-Host、コンソールに書き込みます。'echo'はWrite-Output、パイプラインにも書き込むエイリアスです。コンソールに書き込む最善の方法は、Write-Hostコマンドレットを使用することです。

オブジェクトがパイプラインに書き込まれると、チェーン内の他のコマンドによって消費される可能性があります。例えば:

"hello world" | Do-Something

しかし、これはWrite-Hostパイプラインではなくコンソールに書き込むので機能しません(Do-Somethingは文字列を取得しません)。

Write-Host "hello world" | Do-Something

3
この答えは技術的には正しいですが、初心者のPowerShellユーザーを迷わせているようです。効果的なPowerShellの最初のルールは、パイプラインで役立つ出力を生成することです。Write-Hostを頻繁に使用している場合は、おそらく間違っています。
OldFart

6
さて、それはOPが尋ねたものではなく、コンソールへの書き込み方法ですか?ホストへの書き込みとパイプラインへの書き込みには違いがあり、それぞれが何を行うかを知っておく必要があります。明確にして回答を更新します。
シェイ・レヴィ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.