проблема с хеш-таблицей - PullRequest
3 голосов
/ 24 марта 2011

Я пытаюсь прочитать файл конфигурации, в котором есть несколько пар значений ключа, как показано ниже:

age = 7
server = \\server\
destination = \\nas\public\server\

Вот скрипт, который я использую для чтения файла:

gc "keyval.txt" | % -begin {$h=@{}} -process { $k = [regex]::split($_,'='); if(($k[0].CompareTo("") -ne 0) -and ($k[0].StartsWith("[") -ne $True)) { $h.Add($k[0], $k[1]) } }
$h                    #THIS PRINTS THE KEYS and VALUES
$h.get_item("server") #THIS DOESN'T DO ANYTHING
$h.server             #THIS DOESNT DO ANYTHING AS WELL

Я узнал, что есть некоторые странности с хеш-таблицами в powershell, но не смог удержаться на пути, чтобы избежать странностей.Пожалуйста, помогите мне решить эту проблему.

Ответы [ 3 ]

3 голосов
/ 24 марта 2011

Если вы не хотите изменять файл:

$re = '\s*(\w+)\s*=\s*(\S+)'
Get-Content \temp\foo.txt | 
  Foreach {$ht=@{}} {if ($_ -match $re) {$ht.($matches[1]) = $matches[2]}} {$ht}

Name                           Value
----                           -----
age                            7
server                         \\server\
destination                    \\nas\public\server\
2 голосов
/ 24 марта 2011
 $h = @{}
 gc keyval.txt |% {
 $h[$_.split("=")[0].trim()] = $_.split("=")[1].trim()
 }
 $h 
 $h.get_item("server")
 $h.server

 Name                                 Value                                                                                      
 ----                           -----                                                                                      
 age                            7                                                                                          
 server                         \\server\                                                                                  
 destination                    \\nas\public\server\                                                                       
 \\server\
 \\server\
2 голосов
/ 24 марта 2011

сначала измените свой текст, чтобы применить метод, который я собираюсь научить вас. Под землей каждая строка части значений должна проходить интерпретацию c #, чтобы такие вещи, как \ s или \ p, были плохими, потому что ничего не значат Таким образом, чтобы иметь обратную косую черту, вам нужно экранировать ее обратной косой чертой, например, \\\\ означает два обратных слеша. После исправления файла вы должны прочитать все содержимое файла и применить командлет convertfrom-stringdata. Вот код, наслаждайтесь.

>> $textfromfile = [IO.File]::ReadAllText((resolve-path .\keyval.txt))
>> $hash = ConvertFrom-StringData $textfromfile
>> $hash

Name                           Value
----                           -----
server                         \\server\
age                            7
destination                    \nas\public\server

PD: изменить файл одной строкой

>> (gc .\keyval.txt) | % { $_ -replace '\\', '\\'} | Set-Content .\keyval.txt
...