Powershell散列表不按预期写入文件 - 仅接收“System.Collections”行

时间:2011-05-10 18:14:57

标签: powershell hashtable

有人可以解释 为什么 我的第一个例子不起作用,以及为什么添加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"
}

6 个答案:

答案 0 :(得分:13)

回答为什么部分,你显然有一个解决方案:)

在你的第一个例子中

$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}",或者......格式不明确,所以他们让我们决定并格式化{{{{{{ 1}}陈述。

答案 1 :(得分:7)

我同意mjolinor ...只是没有足够的积分投票...加上我会补充说你不需要GetEnumerator

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

会这样做。

答案 2 :(得分:4)

您的第一个示例不起作用,或者更好,部分起作用,因为您试图在字符串中获取属性值。通常,在字符串内部,解析器只能解析直接变量(如$key)。要解决更复杂的变量,您需要括号。

对于循环,这应该有效:

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

甚至更好

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

答案 3 :(得分:3)

正如您在Microsoft文档中看到的,哈希表只是名称 - 值对的集合。

所以$ht真的System.Collections.HashtableSystem.Collections.DictionaryEntry组成。

使用它的好方法是

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

答案 4 :(得分:1)

怎么样:

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

答案 5 :(得分:0)

您可以使用Out-File:

将哈希表的“原始”转储写入ASCII文件
$data = @{
  Name = "Something"
  Type = "123"
}
$data | Out-File "myfile.txt" -Encoding ascii