是否可以在Powershell中格式化哈希表的输出以将所有值输出到一行?
e.g。
我的哈希表 $ hashErr 具有以下值:
$hashErr = @{"server1" = "192.168.17.21";
"server2" = "192.168.17.22";
"server3" = "192.168.17.23"}
使用以下内容写入日志:
$hashErr.GetEnumerator() | Sort-Object Name | ForEach-Object {ForEach-Object {"{0}`t{1}" -f $_.Name,($_.Value -join ", ")} | Add-Content $log
将导致以下内容写入日志:
Name Value
---- -----
server2 192.168.17.22
server1 192.168.17.21
server3 192.168.17.23
我的问题是,如何格式化这个哈希表,以便将输出全部写入一行,如下所示?
server2 192.168.17.22 | server1 192.168.17.21 | server3 192.168.17.23
这可以通过循环哈希表中的所有值并将它们放入数组来完成,但肯定有更直接的方法吗?
答案 0 :(得分:8)
您可以迭代哈希表的键,然后在循环中查找值。通过使用管道,您不需要中间集合:
($hashErr.Keys | foreach { "$_ $($hashErr[$_])" }) -join "|"
答案 1 :(得分:3)
Richard的解决方案的V4版本:
$hashErr = @{"server1" = "192.168.17.21";
"server2" = "192.168.17.22";
"server3" = "192.168.17.23"}
$hashErr.Keys.ForEach({"$_ $($hashErr.$_)"}) -join ' | '
server3 192.168.17.23 | server2 192.168.17.22 | server1 192.168.17.21
答案 2 :(得分:1)
您是否希望在单个服务器上保留排序和支持多个IP地址,这两个地址都在您显示的代码中但不在输出中?
如果是这样,我认为你得到的最好只是对原作的一个小修改:
C:\scripts> ($hashErr.GetEnumerator() | sort Name | % { "$($_.Name) $($_.Value -join ',')" }) -join "|"
server1 192.168.17.21|server2 192.168.17.22|server3 192.168.17.23,1.2.3.4
答案 3 :(得分:1)
派对有点晚了,扩展@mjolinor的解决方案,你可以使用类型加速器[ordered]:
$hashErr = [ordered]@{"server1" = "192.168.17.21";
"server2" = "192.168.17.22";
"server3" = "192.168.17.23"}
$hashErr.Keys.ForEach({"$_ $($hashErr.$_)"}) -join ' | '
server1 192.168.17.21 | server2 192.168.17.22 | server3 192.168.17.23
我认为[命令]是在PS v.3.0中引入的。
答案 4 :(得分:0)
不是您想要的exat输出,而是1行输出。
$hashErr | ConvertTo-Json -Compress
输出:
{"server2":"192.168.17.22","server3":"192.168.17.23","server1":"192.168.17.21"}