На момент написания есть два ответа (один от Шей Леви и один от Джона Зи), которые оба близки, но ни один из них не совсем правильный, несмотря на то, что ответ Шэя уже был принят (!). Вот почему:
Проблемы с кодом Шэя
Ответ Шэя слишком буквальный, основанный на неточно сформулированном требовании, которое указывает на создание «хэш-таблицы, в которой могут быть такие записи»:
@(Key=Mailcomp,Value=BL_2.1.0.9.5179)
@(Key=OfficeComp, Value=BL_2.1.0.17.6972)
Но если кто-то собирается использовать синтаксис PowerShell, это указано неверно. Требование в реальности должно выглядеть так:
@{Mailcomp=BL_2.1.0.9.5179}
@{OfficeComp=BL_2.1.0.17.6972}
Другими словами, первая строка определяет хеш-ключ Mailcomp
и хэш-значение BL_2.1.0.9.5179
. Эта модифицированная версия кода Шэя обеспечивает именно это:
$hash = @{}
Get-Content $BaselineFile |
Foreach-Object {
if ($_ -match '^\(([^@]+).+\)\s([^@]+)')
{
$hash[$matches[1]]=$matches[2]
}
}
Вот результат:
Name Value
---- -----
Mailcomp BL_2.1.0.9.5179
OfficeComp BL_2.1.0.17.6972
С этим намного проще работать, так как теперь я могу получить доступ к $hash["Mailcomp"]
или $hash["OfficeComp"]
для получения соответствующих значений.
Вторая проблема с кодом Шэя — это само создание хеш-записи (@{ key=$matches[1]; value=$matches[2] }
). Этот оператор создает отдельную "мини" хеш-таблицу для каждой итерации (т.е. для каждой строки ввода). Кажется, он выдает приемлемый результат только из-за объединения неявного Write-Output в его коде. Чтобы доказать это — и сравнить яблоки с яблоками — возьмите мой код выше и замените условное выражение на этот, эквивалентный коду Шэя:
if ($_ -match '^\(([^@]+).+\)\s([^@]+)')
{
@{ $matches[1]=$matches[2] }
}
Вы обнаружите, что $hash["Mailcomp"]
не возвращает ожидаемое BL_2.1.0.9.5179
.
Проблемы с кодом Джона
Мне нравится ответ Джона Зи; Я действительно. Действительно. Но это напоминает мне старый добрый анекдот с изюминкой предположим, что у нас есть консервный нож. .. Это очень хорошее решение тогда и только тогда, когда ввод поддается простому разделителю. Здесь дело обстоит иначе — для массажа ввода требуется регулярное выражение (или другой механизм). Честно говоря, Джон отмечает, что явно заявляя, что он предполагает некоторую предварительную обработку. — сказал Нафф.
person
Michael Sorens
schedule
10.01.2012