web-dev-qa-db-ja.com

Powershellハッシュテーブルが期待どおりにファイルに書き込まない-「System.Collections」行のみを受信する

誰かが説明してもらえますかなぜ私の最初の例が機能しないのか、そしてなぜForEach-Objectを追加することで問題が解決するのですか?前もって感謝します!


コマンドからの戻り値をハッシュテーブル(投稿の最後のサンプル)に解析し、処理の一部として情報をファイルに記録したいと思います。 $ht.GetEnumerator() | Sort-Object Nameは、ソートされた完全なハッシュを画面に返すことを知っています。しかし、ファイルに送信しようとすると壊れます。

$ht | Add-Content log.txt

System.Collections.Hashtableの単一行のみをログに記録します。だから、私も試しました

$ht.GetEnumerator() | Sort-Object Name | Add-Content log.txt 

そして、の行で終わります

System.Collections.DictionaryEntry
System.Collections.DictionaryEntry
System.Collections.DictionaryEntry

それで私はループしてそれぞれを個別に処理しようとしました

foreach ($key in $ht.keys) {
Add-Content log.txt "$key : $ht.$key" }

そして、

Server address : System.Collections.Hashtable.Server address
Client address : System.Collections.Hashtable.Client address
User name : System.Collections.Hashtable.User name

で解決:

$ht.GetEnumerator() | Sort-Object Name |
ForEach-Object {"{0} : {1}" -f $_.Name,$_.Value} |
Add-Content log.txt 

参考までに、ハッシュテーブルのサンプルは次のとおりです。

$ht = @{
    "Server address" = "server.net";
    "Client address" = "10.20.121.153";
    "User name" = "myuser"
}
12
rand0m1

whyの部分に答えると、明らかに解決策があります:)

最初の例では

$ht | Add-Content log.txt

PowerShellは$htを受け取り、それを文字列に変換して、Add-Contentを介して保存できるようにします。ハッシュテーブルに変換が定義されていないため、変換から返されるのは型名のみです。たとえばnew-Object Random|Add-Content d:\log.txtと同じです。ここでも、型名のみが書き込まれます。

$ht.GetEnumerator() | Sort-Object Name | Add-Content log.txt 

似ている。 GetEnumeratorは、反復に使用されるオブジェクトを返します。タイプSystem.Collections.DictionaryEntryのオブジェクトが返されます。ここでも、文字列への変換がないため、型名が返されます。

個人的には、PowerShellは十分に賢く、ここで役立つはずだと思います。問題は「どうやって?」です。設計者はおそらく出力をハードコーディングしたくなかったでしょう。 "{key}: {value}"または"{key} = {value}"、または"{key}/{value}"、または...形式が明確ではないため、foreachステートメントで行ったように、私たちが決定してフォーマットすることを任されました。 。

13
stej

私はmjolinorに同意します...投票するのに十分なポイントがありません...さらに、GetEnumeratorは必要ないことを追加します

$ht | out-string | add-content log.txt

それをします。

8
jrich523

文字列内のプロパティ値を取得しようとしているため、最初の例は機能しないか、部分的に機能します。通常、文字列内では、パーサーは直接変数($keyなど)のみを解決できます。より複雑な変数を解決するには、括弧が必要です。

ループの場合、これは機能するはずです。

 foreach($ ht.keysの$ key){
 Add-Content log.txt "$ key:$($ ht。$ key)"} 

またはさらに良い

 $ ht.keys | %{Add-Content log.txt "$ _:$($ ht。$ _)"} 
4
Emiliano Poggi

Microsoftのドキュメントでわかるように、ハッシュテーブルは単に名前と値のペアのコレクションです。

そう $ht 本当に System.Collections.Hashtable 構成されている System.Collections.DictionaryEntry

それを使用する良い方法は

foreach ($i in $ht.keys)
{
  add-content log.txt ("{0} {1}" -f $i, $ht[$i])
}
4
JPBlanc

どうですか:

 $ht.GetEnumerator() | Sort-Object Name | out-string | Add-Content log.txt 
1
mjolinor

Out-Fileを使用して、ハッシュテーブルの「生の」ダンプをASCIIファイルに書き込むことができます:

$data = @{
  Name = "Something"
  Type = "123"
}
$data | Out-File "myfile.txt" -Encoding ascii
0
Skatterbrainz