Варианты использования [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