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