PowerShell的哈希表问题
问题描述:
我想读其中有一些键值对的配置文件: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中存在一些哈希表的一些奇怪之处,但无法阻止这种奇怪的方式。请帮我解决这个问题。
答
如果你不想修改文件:
$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\
答
首先修改你的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
答
$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\
不错,我不知道3个scriptblocks的语法来表示开始。过程结束。 :) – mjsr 2011-03-24 11:51:01
你能告诉我为什么$ re =“\ s * \ w + \ s * = \ s * \ S +”在$匹配中只产生一个结果,而使用括号产生3,我在表达式中看不到差异 – mjsr 2011-03-24 12:03:10
别担心,我在msdn中找到它。 2个新东西与您的答案一起学习。这将帮助我完成一些任务。 – mjsr 2011-03-24 12:14:43