Статья размещена автором Бетке Сергей Сергеевич

PowerShell: Обработка HashTable в конвейере powerShell

С одной стороны hashtable – вполне “родной” тип для powerShell. С другой стороны обработка его в стиле PowerShell (подразумеваю – в pipeline через фильтрующие функции) “из коробки” невозможна. Как же это иногда бывает неудобно. Однако, несколько функций решают эту задачу.

Приведу сначала конечный код – простейший пример:

@{
    'А'='A';
    'Б'='B';
    'В'='V';
    'Г'='G';
} `
| ConvertFrom-Dictonary `
| ? { 'А','Б' -contains $_.key } `
| ConvertTo-HashTable `
;

Пример, ясное дело, “из пальца высосан”. Но суть вполне ясно демонстрирует. А теперь приведу реализацию самих функций:

function ConvertFrom-Dictonary {
    param (
        # Исходный словарь для конвейеризации
        [Parameter(
            Mandatory=$true,
            Position=0,
            ValueFromPipeline=$true
        )]
        [AllowEmptyCollection()]
        [System.Collections.IDictionary]
        $InputObject = @{}
    )

    process {
        foreach ($key in $InputObject.keys) {
            New-Object -TypeName PSObject `
            | Select-Object -Property `
                @{ Name='Key'; Expression={ $key } } `
                , @{ Name='Value'; Expression={ $InputObject[$key] } }
            ;
        };
    }
}  

function ConvertTo-HashTable {
    param (
        # Ключ key для hashtable.
        [Parameter(
            Mandatory=$true,
            Position=0,
            ValueFromPipelineByPropertyName=$true
        )]
        [ValidateNotNullOrEmpty()]
        [string]
        $Key
    ,
        # Значение Value для hashtable.
        [Parameter(
            Mandatory=$true,
            Position=1,
            ValueFromPipelineByPropertyName=$true
        )]
        $Value
    )

    begin {
        $output = @{};
    }
    process {
        $output.Add( $key, $Value );
    }
    end {
        return $output;
    }
} 

Однако, первая функция может быть записана куда проще и при этом – более производительно:

function ConvertFrom-Dictionary {
    param (
        # Исходный словарь для конвейеризации
        [Parameter(
            Mandatory=$true,
            Position=0,
            ValueFromPipeline=$true
        )]
        [AllowEmptyCollection()]
        [System.Collections.IDictionary]
        $InputObject = @{}
    )

    process {
        $InputObject.GetEnumerator();
    }
}

Приведённые выше функции включены в модуль ITG.Utils, опубликованный на github.

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка