2017-08-01 15 views
0

パイプライトされたデータ/オブジェクトの操作でWrite-Hostは何をしますか?Powershellでは、Write-Host呼び出しでパイプオブジェクトのメソッドを呼び出す

私の場合、$xmlContentを実行すると、オブジェクトのテーブルが出力されます。$xmlContent | Write-Hostを実行すると、実際のXMLが出力されます。 $xmlContent.ToString()を実行すると、Write-Hostによって生成されるものと同じ出力ではありません。したがって上記の質問。

答えて

2

ToString()はfrom the underlying PSObjectなので、オブジェクトの文字列表現が得られるはずです。 したがって、オブジェクトを入力すると結果が変わります。 ToString()は、あなたが入力したものに依存します。 Write-HostはToString()を呼び出します。

私は違いが観察するために3つのシナリオを試してみました: Last scenario is from Shay Levy's post.

$untyped = Get-Content 'some.xml' 
$untyped.ToString() 
$pureDoc | Write-Host 

[xml]$typed = Get-Content 'some.xml' 
$typed.ToString() 
$typed | Write-Host 

$pso = new-object psobject -property @{ name = 'bob'; job = 'janitor' } 
$pso | add-member scriptmethod ToString { 'he is a {0}, he is' -f $this.job } -force 
$pso.ToString() 
$pso | Write-Host 

出力は次のとおりです。

System.Object[] 
[XML omitted for brevity] 
#document 
#document 
he is a janitor, he is 
he is a janitor, he is 

あなたが書く-ホストどのように収益をToStringメソッド(の実装となり何でも参照)?

2

Write-Hostは通常、物事を行うための最善の方法直感的かそうでないいくつかのことを行いますので、私はそれを使用してからあなたを落胆します。代わりに、Write-VerboseWrite-Outputをチェックしてください(または可能性をすべて確認するにはGet-Help Write-*を試してください)。

INPUT:

Write-Host予期しないことができる方法で入力を変更します。 stringintまたは他のよく知られているタイプを出力するとき、その入力の内容を出力します。しかし、あなたが見て混乱したと確信しているように、Write-Hostのコンテンツが出力されないタイプもあります。代わりに、入力のタイプを出力するだけです。ほとんどの場合、これはかなり役に立たない。

OUTPUT:自身の入力を書き込み、または機能にreturnを書き込むと同じ形式で

Write-Host

出力します。彼らはstring種類だけでなく、いくつかの他の人のために同等であることをもう一度

$str 

Write-Host $str 

return $str #in context of a function 

注意が、Write-Hostは、他のタイプのための奇妙な方法で入力を操作することができる。これらの3つは、たとえば、文字列型のために同等に使用することができます。

一般に、Write-Hostを使用することはお勧めしません。コンソールにデバッグ/出力するには、Write-Verboseを使用します。パイプラインまたは関数から出力するには、変数を単独で記述します。この意志出力我々はPowerShellで使用するために使用されている素敵な辞書形式のフォーマット:

PS C:\Windows\system32> write-host $dict 
System.Collections.DictionaryEntry System.Collections.DictionaryEntry 
:に比べ

PS C:\Windows\system32> $dict 

Name       Value 
----       ----- 
key       value 
{test, test2}     1 

関連する問題