2011-03-23 124 views
3

我想讀其中有一些鍵值對的配置文件:PowerShell的哈希表問題

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

這裏是我用來讀取文件的腳本:

gc "keyval.txt" | % -begin {[email protected]{}} -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

如果你不想修改文件:

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

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

不錯,我不知道3個scriptblocks的語法來表示開始。過程結束。 :) – mjsr 2011-03-24 11:51:01

+0

你能告訴我爲什麼$ re =「\ s * \ w + \ s * = \ s * \ S +」在$匹配中只產生一個結果,而使用括號產生3,我在表達式中看不到差異 – mjsr 2011-03-24 12:03:10

+0

別擔心,我在msdn中找到它。 2個新東西與您的答案一起學習。這將幫助我完成一些任務。 – mjsr 2011-03-24 12:14:43

2

首先修改你的txt來應用我要教你的方法。地下每個值的部分都必須通過c#解釋,所以\ s或\ p之類的東西都不好,因爲它們並不代表什麼。所以要有一個反斜槓,你需要用反斜槓來轉義它,例如\\\\表示兩個反斜槓。修復文件後,您必須讀取文件的所有內容並應用convertfrom-stringdata cmdlet。這是代碼,享受。

>> $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 
+0

感謝偉大的答案。這對我很有用,但我配置文件從另一個進程生成,並且改變它需要改變這個進程。不過,您的回答讓我們深入瞭解了Powershell中的很多新功能。謝謝! – Animesh 2011-03-24 11:40:46

2
$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\