Выведите хеш-таблицу массивов в Powershell - PullRequest
7 голосов
/ 31 марта 2011

Я в своем уме.Я новичок в 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, ALLOCATIONS, AUDIT_TRAIL, BOOKS ...}
20091202 {31, ALLOCATIONS, AUDIT_TRAIL, BOOKS ...}
20091203 {31, ALLOCATIONS, AUDIT_TRAIL, BOOKS ...}
20091204 {31, ALLOCATIONS, AUDIT_TRAIL, BOOKS ...}
20091207 {31, ALLOCATIONS, AUDIT_TRAIL, BOOKS ...}
20091208 {31, ALLOCATIONS, AUDIT_TRAIL, КНИГИ ...}
20091209 {31, РАСПРЕДЕЛЕНИЯ, AUDIT_TRAIL, КНИГИ ...}
20091210 {31, РАСПРЕДЕЛЕНИЯ, AUDIT_TRAIL, КНИГИ ...}
20091211 {31, РАСПРЕДЕЛЕНИЯ, AUDIT_TRAIL, КНИГИ...}
20091214 {31, ALLOCATIONS, AUDIT_TRAIL, BOOKS ...}
20091215 {31, ALLOCATIONS, AUDIT_TRAIL, BOOKS ...}

Кто-то мудрееof powershell, пожалуйста, скажите мне, что мне не хватает.Как мне избавиться от этих кровавых многоточий в конце и просто записать все элементы массива независимо от их количества?Должен ли я просто применить какое-то решение для гетто, создав большой строковый буфер и выведя его в файл, или есть лучший способ сделать это?

Спасибо.

Ответы [ 2 ]

8 голосов
/ 01 апреля 2011

По этой причине вы не должны использовать Out-File, он работает через механизм форматирования по умолчанию.То, что вы хотите использовать, это Set-Content / Add-Content, как это.

$lookupTable.GetEnumerator() | Sort-Object Name |
    ForEach-Object {"{0}`t{1}" -f $_.Name,($_.Value -join ",")} |
    Add-Content C:\hashFiles.txt
2 голосов
/ 01 апреля 2011

Хорошо, 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
}
...