Используйте случаи [упорядоченного], новую функцию PowerShell 3.0
PowerShell 3.0 CTP1 представляет новую функцию [ordered]
, которая является ярлыком для OrderedDictionary
. Я не могу представить себе практические примеры использования. Почему эта функция действительно полезна? Может ли кто-нибудь предоставить некоторые полезные примеры?
Пример: это IMHO, скорее демонстрационный пример, чем практический:
$a = [ordered]@{a=1;b=2;d=3;c=4}
(Я не возражаю, если он по-прежнему полезен, тогда я просто ищу другие полезные случаи).
Я не ищу примеры использования OrderedDictionary
, это действительно полезно. Но мы можем использовать его непосредственно в версии 2.0 (и я много делаю). Я пытаюсь понять, почему эта новая функция [ordered]
необходима дополнительно.
Собранные варианты использования ответов:
$hash = [ordered]@{}
короче
$hash = New-Object System.Collections.Specialized.OrderedDictionary
N.B. ordered
не является реальным ярлыком для типа. New-Object ordered
не работает.
N.B. 2: Но это все еще хороший ярлык, потому что (я думаю, не могу попробовать) он создает типичный для PowerShell регистр, нечувствительный к регистру. Эквивалентная команда в версии 2.0 слишком длинная:
New-Object System.Collections.Specialized.OrderedDictionary]([System.StringComparer]::OrdinalIgnoreCase)
Ответы
Ответ 1
Сначала я начну с вопроса: "Почему бы не иметь их?
Я могу придумать пример использования в моем проекте, где мы используем сценарии Powershell для сборки и развертывания и yml для конфигурации (используя https://github.com/scottmuc/PowerYaml)
Конфигурация из yml считывается как hashtables. Задачи задаются в yml, например, развертываются в базе данных, развертываются в iis, развертываются службы и т.д. Я хотел бы сделать развертывание базы данных, а затем развертывать веб-сайт, чтобы впоследствии избежать iisreset. В настоящее время я должен явно рассмотреть это. Теперь я могу иметь упорядоченную хеш-таблицу и сначала указать базу данных развертывания, и, следовательно, это произойдет сначала.
Отрывок:
function Convert-YamlMappingNodeToHash($node)
{
$hash = @{}
$yamlNodes = $node.Children
foreach($key in $yamlNodes.Keys)
{
$hash[$key.Value] = Explode-Node $yamlNodes[$key]
}
return $hash
}
Теперь $hash [email protected]{}
станет $hash=[ordered]@{}
Я не знаю, как это означает раздутый продукт. OrderedDictionary существует в .NET(у меня есть много вариантов использования в программировании), и они просто добавили для него ускоритель.
Ответ 2
Это на самом деле особенно полезно для создания на лету объектов, вроде как вы используете ExpandoObject в С# или динамических объектах в JavaScript. Проблема с выполнением этого в предыдущих версиях PowerShell заключается в том, что @{}
(который становится регулярным HashTable
) теряет ваш порядок ключей, так что огромная PITA отображает их на экране.
Рассмотрим это.
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
, не было бы способа восстановить исходный порядок ключей.
Ответ 3
Это полезно для выполнения SQL-соединения (aka merging или zipping) двух файлов данных. Возможно, файлы CSV или JSON.
Вы хотите создать хэш-таблицу из первого файла, слить или использовать данные из второго файла, затем передать изменения обратно на диск или на следующий шаг script.
С помощью [упорядоченного] вы можете сохранить тот же порядок исходного файла, но все равно использовать его как хэш-таблицу.
Ответ 4
Я видел, что он использовался в сценариях powershell, которые создают вкладки информации и сортируют вкладки. Например, извлечение информации на жестком диске с нескольких серверов, каждый сервер на своей вкладке, а затем сортировку вкладок по имени сервера перед сохранением. Код "сортировка табуляции" выглядит следующим образом:
$i=0;$wb.Worksheets | %{$i++;[ordered]@{$_.name=$i}}
-Gill