在 Powershell 中输出数组的哈希表

Posted

技术标签:

【中文标题】在 Powershell 中输出数组的哈希表【英文标题】:Output a hashtable of Arrays in Powershell 【发布时间】:2011-07-26 12:53:53 【问题描述】:

我束手无策。我是 powershell 的新手,我已经尝试了所有我能在网上找到的关于这个主题的东西。我想要做的是将数组的哈希表打印到文件中,而不会在每个数组值的末尾出现愚蠢的省略号。以下是我的最佳尝试。

# Update output buffer size to prevent clipping in output window.
if( $Host -and $Host.UI -and $Host.UI.RawUI ) 

   $rawUI = $Host.UI.RawUI
   $oldSize = $rawUI.BufferSize
   $typeName = $oldSize.GetType( ).FullName
   $newSize = New-Object $typeName (1000, $oldSize.Height)
   $rawUI.BufferSize = $newSize


# Suposedly to allow enumeration in formatting to be unlimited
$formatenumerationlimit = -1

$Dir = get-childitem c:\SomeFolderWithFiles -recurse
$List = $Dir | where $_.extension -eq ".hash" | where-object $_ -ne $null
$lookupTable = @
Foreach ($element in $List)

    #Get the type of file from filename
    $PSV_Type = $element.Name.Substring(0, $element.Name.indexOf("."))
    #Get the date sent from filename
    $Date_Sent = $element.Name.Substring($element.Name.length - 20,8)

    #Populate hashTable
    .....

$columns = @Expression=$_.Name;Label="Date_Sent";width=12, @Expression=$_.Value;Label="PSV_Types";width=1000
$lookupTable.GetEnumerator() | Sort-Object Name | Format-Table $columns | out-file C:\hashFiles.txt -width 1012

在这一切之后,我仍然得到这个结果:

Date_Sent PSV_Types --------- --------- 20091201 31,分配,AUDIT_TRAIL,书籍... 20091202 31,分配,AUDIT_TRAIL,书籍... 20091203 31,分配,AUDIT_TRAIL,书籍... 20091204 31,分配,AUDIT_TRAIL,书籍... 20091207 31,分配,AUDIT_TRAIL,书籍... 20091208 31,分配,AUDIT_TRAIL,书籍... 20091209 31,分配,AUDIT_TRAIL,书籍... 20091210 31,分配,AUDIT_TRAIL,书籍... 20091211 31,分配,AUDIT_TRAIL,书籍... 20091214 31,分配,AUDIT_TRAIL,书籍... 20091215 31, ALLOCATIONS, AUDIT_TRAIL, BOOKS...

在 powershell 方面更聪明的人请告诉我我缺少什么。我如何在最后去掉这些血腥的省略号,不管有多少数组的所有成员都写出来?我是否必须通过构建一个大字符串缓冲区并将其输出到文件来推出一些 ghetto 解决方案,还是有更好的方法来做到这一点?

谢谢。

【问题讨论】:

【参考方案1】:

好吧,powershell 不会很好玩。这是我唯一可以开始工作的事情:

$lookupTable = $lookupTable.GetEnumerator() | Sort-Object Name 

foreach ($element in $lookupTable)

    $msg = $element.Key + "`t"
    foreach ($psv in $element.Value)
    
        $msg = $msg + $psv + ","
    
    #remove last comma and add newline
    $msg = $msg.SubString(0, $msg.length -1) + "`n"

    Add-Content C:\hashFiles.txt $msg

【讨论】:

【参考方案2】:

出于这个原因,您不应该使用 Out-File,它会通过默认的格式化引擎运行。您要使用的是这样的 Set-Content/Add-Content。

$lookupTable.GetEnumerator() | Sort-Object Name |
    ForEach-Object "0`t1" -f $_.Name,($_.Value -join ",") |
    Add-Content C:\hashFiles.txt

【讨论】:

以上是关于在 Powershell 中输出数组的哈希表的主要内容,如果未能解决你的问题,请参考以下文章

在 Powershell 中创建多维哈希表数组

在 PowerShell 中返回具有单个元素的数组

PowerShell对象排序(结合哈希表)

在powershell中展平数组

在 PowerShell 中合并哈希表:如何?

powershell Powershell函数从文件中读取哈希表文本表示并将其转换为哈希表对象