在Powershell中格式化哈希表的输出以输出到一行

时间:2014-01-07 15:15:16

标签: powershell hashtable

是否可以在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

这可以通过循环哈希表中的所有值并将它们放入数组来完成,但肯定有更直接的方法吗?

5 个答案:

答案 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"}