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.
RSS комментарии
Обратная ссылка