powershell哈希表问题

powershell哈希表问题,powershell,hashtable,powershell-2.0,Powershell,Hashtable,Powershell 2.0,我正在尝试读取一个配置文件,其中包含一些键值对,如下所示: 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 $Tr

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

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

我了解到powershell中的哈希表有一些奇怪的地方,但无法找到避免这些奇怪之处的方法。请帮我解决这个问题。

首先修改您的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

如果不想修改文件,请执行以下操作:

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

谢谢你的回答。这对我来说是可行的,但我认为配置文件是从另一个进程生成的,更改它需要更改该进程。尽管如此,您的回答还是让我们深入了解了Powershell中的许多新内容。谢谢很好,我不知道表示开始的3个脚本块的语法。过程,结束。:)你能告诉我为什么$re=“\s*\w+\s*=\s*\s+”只生成一个$matches结果,用括号生成3,我看不出表达式中的差异。别担心,我在msdn中找到了它。通过你的回答,你学到了2个新的东西。这将帮助我完成一些任务。