Powershell哈希表未按预期写入文件-仅接收“0”;系统.收集“;排

Powershell哈希表未按预期写入文件-仅接收“0”;系统.收集“;排,powershell,hashtable,Powershell,Hashtable,有人能解释一下为什么我的第一个示例不起作用,以及为什么添加ForEach对象可以解决这个问题吗?提前谢谢 我将命令返回的内容解析为哈希表(文章末尾的示例),并希望将信息记录到文件中,作为处理的一部分。我知道$ht.GetEnumerator()| Sort Object Name会将完整的哈希返回到屏幕,并进行排序。然而,一旦我尝试将内容发送到文件,它就会中断 $ht | Add-Content log.txt 只记录一行System.Collections.Hashtable。所以,我也试

有人能解释一下为什么我的第一个示例不起作用,以及为什么添加ForEach对象可以解决这个问题吗?提前谢谢


我将命令返回的内容解析为哈希表(文章末尾的示例),并希望将信息记录到文件中,作为处理的一部分。我知道
$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 = @{
    "Server address" = "server.net";
    "Client address" = "10.20.121.153";
    "User name" = "myuser"
}

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

对于循环,这应该是可行的:

foreach ($key in $ht.keys) { Add-Content log.txt "$key : $($ht.$key)" } foreach($ht.keys中的key){ 添加Content log.txt“$key:$($ht.$key)”} 甚至更好

$ht.keys | %{ Add-Content log.txt "$_ : $($ht.$_)" } $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 

回答“为什么”部分,你显然有一个解决办法:)

在您的第一个示例中

$ht | Add-Content log.txt
PowerShell获取
$ht
,并尝试以某种方式将其转换为字符串,以便通过
添加内容来存储它。因为没有为哈希表定义转换,所以转换只返回类型名。与示例相同
newobjectrandom |添加内容d:\log.txt
。同样,只写入类型名称

下一个

这是相似的
GetEnumerator
返回用于迭代的对象;返回类型为
System.Collections.DictionaryEntry
的对象。同样,没有转换为字符串,因此返回类型名


就个人而言,我认为PowerShell应该足够聪明,并在这里提供帮助。问题是“如何?”。设计者可能不想硬编码输出。它可能是
“{key}:{value}”
“{key}={value}”
,或
“{key}/{value}”
,或。。。格式不清楚,所以他们留给我们来决定和格式化,就像你用
foreach
语句所做的那样。

我同意mjolinor。。。只是没有足够的分数去投票。。。另外,我还要补充一点,您不需要GetEnumerator

$ht | out-string | add-content log.txt
就可以了。

您可以使用Out文件将哈希表的“原始”转储写入ASCII文件:

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

有趣-这也有吐出标题的好处-当我将来需要这些标题时,它会派上用场-谢谢!啊。。。所以我原来的循环是如此接近。因此,强制格式化将转换为可以优雅地添加内容句柄的字符串。明白了。谢谢你的一行解决方案-简洁性很好。虽然我认为在阅读了其他文章之后,我倾向于将你的缩写词与我的排序结合起来,并采用更明确的格式,以便于阅读。感谢你的解释——我知道这一定与转换为字符串有关,我只是没有掌握其中的机制。你的解释和每个人更具体的例子结合在一起,帮助很大!
$ht | out-string | add-content log.txt
$data = @{
  Name = "Something"
  Type = "123"
}
$data | Out-File "myfile.txt" -Encoding ascii