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