【问题标题】:powershell hashtable problempowershell哈希表问题
【发布时间】:2011-03-23 23:42:30
【问题描述】:

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

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 中的哈希表存在一些奇怪之处,但无法避免这些奇怪之处。请帮我解决这个问题。

【问题讨论】:

    标签: powershell hashtable powershell-2.0


    【解决方案1】:

    如果不想修改文件:

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

    【讨论】:

    • 很好,我不知道 3 个脚本块的语法来表示开头。过程,结束。 :)
    • 你能告诉我为什么 $re = "\s*\w+\s*=\s*\S+" 在 $matches 中只生成一个结果,而用括号生成 3,我看不到表达式的差异
    • 别担心,我在 msdn 中找到了它。从您的回答中学到了 2 件新东西。这将帮助我完成一些任务。
    【解决方案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
    

    【讨论】:

    • 感谢您的精彩回答。这对我有用,但是我的配置文件是从另一个进程生成的,并且更改它需要更改该进程。不过,您的回答让我们深入了解了 Powershell 中的许多新内容。谢谢!
    【解决方案3】:
     $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\
    

    【讨论】:

      猜你喜欢
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      相关资源
      最近更新 更多