Используйте случаи [упорядоченного], новую функцию 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