Варианты использования [ordered], новая функция PowerShell 3.0

PowerShell 3.0 CTP1 представляет новую функцию [ordered] который является несколько ярлык для OrderedDictionary. Я не могу представить себе практических случаев его использования. Почему эта функция действительно полезна? Кто-нибудь может привести несколько полезных примеров?

пример: это, ИМХО, скорее демонстрационный случай, чем практический:

$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 не работает.

N. B. 2: но это все еще хороший ярлык, потому что (я думаю, не могу попробовать) он создает типичный для случая PowerShell бесчувственный словарь. Эквивалентная команда в v2.0 действительно слишком длинно:

New-Object System.Collections.Specialized.OrderedDictionary]([System.StringComparer]::OrdinalIgnoreCase)

4 ответов


сначала я начну с вопроса-почему бы не иметь их?

Я могу придумать вариант использования в моем проекте, где мы используем сценарии Powershell для сборки и развертывания и yml для конфигурации (используяhttps://github.com/scottmuc/PowerYaml)

конфиг из YML-это читать в качестве хеш-таблицы. Задачи указаны в 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 =@{} стать $hash=[ordered]@{}

Я не знаю, как это означает на раздутый продукт. OrderedDictionary есть в .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] вы действительно можете указать . Это создаст фактический PSObject с самого начала Вместо того, чтобы требовать отдельного вызова New-Object. Я не могу сказать наверняка, но я уверен, что [Ordered] был побочным эффектом изменений, которые они внесли в парсер, чтобы это произошло. Если бы они просто делали преобразование из обычного Hashtable не было бы никакого способа, чтобы восстановить исходный порядок ключей.


Это полезно для выполнения SQL-соединения (он же слияние или сжатие) двух файлов данных. Возможно, файлы CSV или JSON.

вы хотите создать хэш-таблицу из первого файла, объединить или использовать данные из второго файла, а затем передать изменения обратно на диск или на следующий шаг сценария.

с [ordered] вы можете сохранить тот же порядок исходного файла, но по-прежнему использовать его как хэш-таблицу.


Я видел, как он используется в сценариях powershell, которые создают вкладки информации и сортируют вкладки. Например, получение информации о жестком диске с нескольких серверов, каждый сервер на своей вкладке, а затем сортировка вкладок по имени сервера перед сохранением. Код" Tab sort " выглядит следующим образом:

$i=0;$wb.Worksheets | %{$i++;[ordered]@{$_.name=$i}}

- Gill