誰かが説明してもらえますかなぜ私の最初の例が機能しないのか、そしてなぜ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"
}
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
ステートメントで行ったように、私たちが決定してフォーマットすることを任されました。 。
私はmjolinorに同意します...投票するのに十分なポイントがありません...さらに、GetEnumeratorは必要ないことを追加します
$ht | out-string | add-content log.txt
それをします。
文字列内のプロパティ値を取得しようとしているため、最初の例は機能しないか、部分的に機能します。通常、文字列内では、パーサーは直接変数($key
など)のみを解決できます。より複雑な変数を解決するには、括弧が必要です。
ループの場合、これは機能するはずです。
foreach($ ht.keysの$ key){ Add-Content log.txt "$ key:$($ ht。$ key)"}
またはさらに良い
$ ht.keys | %{Add-Content log.txt "$ _:$($ ht。$ _)"}
Microsoftのドキュメントでわかるように、ハッシュテーブルは単に名前と値のペアのコレクションです。
そう $ht
本当に System.Collections.Hashtable
構成されている System.Collections.DictionaryEntry
。
それを使用する良い方法は
foreach ($i in $ht.keys)
{
add-content log.txt ("{0} {1}" -f $i, $ht[$i])
}
どうですか:
$ht.GetEnumerator() | Sort-Object Name | out-string | Add-Content log.txt
Out-Fileを使用して、ハッシュテーブルの「生の」ダンプをASCIIファイルに書き込むことができます:
$data = @{
Name = "Something"
Type = "123"
}
$data | Out-File "myfile.txt" -Encoding ascii