Вопросы использования [упорядоченных], новая функция PowerShell 3.0
-
22-10-2019 - |
Вопрос
PowerShell 3.0 CTP1 представляет новую функцию [ordered]
что в некоторой степени ярлык для OrderedDictionary
. Анкет Я не могу представить практические случаи этого. Почему эта функция действительно полезна? Может кто -нибудь дать несколько полезных примеров?
Пример: это, imho, скорее демонстрационный случай, чем практичный:
$a = [ordered]@{a=1;b=2;d=3;c=4}
(Я не против, если это все еще полезно, тогда я просто ищу другие полезные случаи).
Я не ищу случаев использования OrderedDictionary
, это действительно полезно. Но мы можем использовать его непосредственно в v2.0 (и я много делаю). Я пытаюсь понять, почему эта новая функция [ordered]
необходимо в дополнение.
Собранные варианты использования из ответов:
$hash = [ordered]@{}
короче, чем
$hash = New-Object System.Collections.Specialized.OrderedDictionary
Нб ordered
не является настоящим ярким достоинством для типа. New-Object ordered
не работает.
NB 2: Но это все еще хороший ярлык, потому что (я думаю, не может попробовать), он создает типичный для нечувствительного словаря PowerShell. Эквивалентная команда в v2.0 действительно слишком длинная:
New-Object System.Collections.Specialized.OrderedDictionary]([System.StringComparer]::OrdinalIgnoreCase)
Решение
Сначала я начну с спроса - почему бы не иметь их?
Я могу вспомнить вариант использования в моем проекте, где мы используем сценарии PowerShell для сборки и развертывания и YML для config (используя https://github.com/scottmuc/poweryaml )
Конфигурация из YML читается как хэштеры. Задачи указаны в YML, как развертывание в базе данных, развертывание в IIS, Deploy Service и так далее. Я хотел бы сделать развертывание базы данных, а затем развернуть веб -сайт, чтобы я мог избежать Iisreset после этого. В настоящее время мне приходится явно посмотреть на это. Теперь у меня может быть упорядоченная хэш -таблица и сначала указать базу данных развертывания, и, следовательно, это происходит первым.
Фрагмент:
function Convert-YamlMappingNodeToHash($node)
{
$hash = @{}
$yamlNodes = $node.Children
foreach($key in $yamlNodes.Keys)
{
$hash[$key.Value] = Explode-Node $yamlNodes[$key]
}
return $hash
}
Сейчас $hash =@{}
стали $hash=[ordered]@{}
Я не знаю, как это означает для раздутого продукта. Заказан, есть в .NET (у меня есть много вариантов использования для него в программировании), и они только что добавили для него ускоритель.
Другие советы
Это на самом деле особенно полезно для создания объектов на лету, например, как вы бы использовали Expandoobject в C# или динамическом объектах в JavaScript. Проблема с этим в предыдущих версиях PowerShell заключается в том, что @{}
(что становится обычным HashTable
) теряет заказ ключей, поэтому это огромная лаваша, чтобы отобразить их на экране.
Учти это.
foreach ($row in import-csv blah.csv) {
# In v3: $obj = [Ordered]@{
$obj = @{
Name = $row.Name
Exists = Test-Path $row.FileName
OtherProp = 123
Blah = "derp"
Timestamp = Get-Date
}
New-Object PSObject -Property $Obj
}
В PowerShell V2 порядок столбца непредсказуем, потому что Hashtable
не сохраняет порядок ключей. В PowerShell V3, если вы использовали [Ordered]
Тип, ключевой порядок сохраняется, что делает быстрый и грязный синтаксис PowerShell почти таким же удобным, как и JSON для быстрого создания структур объектов без всех проблем с накладными расходами и производительности, связанных с Add-Member
или же Select-Object
.
Не случайно, есть еще одно дополнение к PowerShell V3. Похожий на [Ordered]
Вы можете указать [PSCustomObject]
вместо. Это создаст фактическую PSObject
с самого начала вместо того, чтобы требовать отдельного вызова New-Object
. Анкет Я не могу сказать наверняка, но я уверен, что [Ordered]
был побочным эффектом изменений, которые они внесли в синтаксис, чтобы это произошло. Если бы они просто делали конверсию в обычном Hashtable
, Там не было бы способа восстановить первоначальный порядок ключей.
Это полезно для выполнения соединения SQL (AKA слияния или Z -ZIPPONGE) два файла данных. Может быть, файлы CSV или JSON.
Вы хотели бы построить хэштату из первого файла, объединить или использовать данные со второго файла, а затем передавать изменения обратно на диск или на следующий шаг сценария.
С [упорядоченным] вы можете сохранить тот же порядок исходного файла, но все же использовать его как хэштат.
Я видел, как он использовался в сценариях PowerShell, которые строят вкладки информации и сортируют вкладки. Например, получение информации о жестком диске с нескольких серверов, каждого сервера на своей собственной вкладке, а затем сортируют вкладки по имени сервера перед сохранением. Код «Сорт» выглядит так:
$i=0;$wb.Worksheets | %{$i++;[ordered]@{$_.name=$i}}
-Gill