PowerShell哈希表问题

3

我正在尝试读取一个配置文件,其中包含一些键值对,如下所示:

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
如果您不想修改文件:
$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\

不错,我之前不知道用三个脚本块表示开始、过程和结束的语法。 :) - mjsr
你能告诉我为什么 $re = "\s\w+\s=\s*\S+" 在 $matches 中只生成一个结果,而加上括号后却生成了三个结果吗?我看不出表达式中的区别。 - mjsr
别担心,我在MSDN上找到了它。通过你的回答,我学到了两件新事物。这将有助于我完成一些任务。 - mjsr

2

首先,修改您的文本以应用我将要教授的方法。在值部分的每个字符串下面必须经过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

注意:修改文件只需一行代码。

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

感谢您提供这么好的答案。这个方法对我很有效,不过配置文件是由另一个进程生成的,更改它需要更改该进程。尽管如此,您的回答让我了解了很多 PowerShell 的新内容。谢谢! - Animesh

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\

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接