Вопросы использования [упорядоченных], новая функция PowerShell 3.0

StackOverflow https://stackoverflow.com/questions/7802406

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top