Варианты использования [упорядоченного], новой функции PowerShell 3.0 - PullRequest
11 голосов
/ 18 октября 2011

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

N.B. ordered не является настоящим сокращением для типа. New-Object ordered не работает.

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

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

Ответы [ 4 ]

11 голосов
/ 02 мая 2012

Это на самом деле особенно полезно для создания объектов типа «на лету», например, как вы бы использовали ExpandoObject в C # или динамические объекты в 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, не было бы никакого способа восстановить первоначальный порядок ключей.

9 голосов
/ 18 октября 2011

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

Я могу вспомнить случай использования в моем проекте, где мы используем сценарии 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 (у меня есть много вариантов его использования в программировании), и они только что добавили ускоритель для него.

2 голосов
/ 02 декабря 2013

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

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

-Gill

2 голосов
/ 20 октября 2013

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

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

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

...