Към момента на писане има два отговора (един от Shay Levy и един от jon Z), които са близки, но нито един не е съвсем правилен - въпреки факта, че отговорът на Shay вече е приет (!). Ето защо:
Проблеми с кода на Shay
Отговорът на Шей е твърде буквален, базиран на неточно заявено изискване, което уточнява създаването на "хеш таблица, която може да има записи като" това:
@(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
. Тази модифицирана версия на кода на Shay предоставя точно това:
$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"]
, за да извлека съответните им стойности.
Втори проблем с кода на Shay е самото създаване на хеш запис (@{ key=$matches[1]; value=$matches[2] }
). Това изявление създава отделна "мини" хеш-таблица за всяка итерация (т.е. всеки ред на входа). Само изглежда произвежда разумен изход поради обединяването на неявния Write-Output в неговия код. За да докажете това – и за да сравните ябълки с ябълки – вземете моя код по-горе и заменете условното с този еквивалент на кода на Шей:
if ($_ -match '^\(([^@]+).+\)\s([^@]+)')
{
@{ $matches[1]=$matches[2] }
}
Ще откриете, че $hash["Mailcomp"]
не връща очакваното BL_2.1.0.9.5179
.
Проблеми с кода на Джон
Харесвам отговора на jon Z; Наистина. Наистина ли. Но това ми напомня за страхотната стара шега с ключовата линия да приемем, че имаме отварачка за консерви. .. Това е много добро решение, ако и само ако входът е податлив на прост разделител. Тук случаят не е такъв - необходим е регулярен израз (или друг механизъм) за масажиране на входа. Честно казано, Джон отбелязва, че изрично като заявява, че предполага известна предварителна обработка. — каза Наф.
person
Michael Sorens
schedule
10.01.2012