【问题标题】:Powershell: Can't access value from file when key is a variablePowershell:当键是变量时,无法从文件中访问值
【发布时间】:2020-06-03 21:43:03
【问题描述】:

当键是变量时,我似乎无法返回与键匹配的值。

我从一个名为 projects.txt 的文件开始,如下所示:

"ID","Name"
"0d769684e36e4cee83b26e8a2b42401b","admin"
"1ba56baa693841199c21b822ccd21dd4","Support"

然后我通过以下方式以key=value 对格式制作第二个文件:

foreach ($line in (Get-Content -encoding ASCII .\projects.txt | select-object -skip 1)){
  $proj_array = $line.split(',')
  $proj_id = $proj_array[0] -Replace '"',""
  $proj_name = $proj_array[1]
  "$proj_id=$proj_name" | out-file -append -encoding ASCII projects_hash.txt
}

projects_hash.txt 看起来像这样:

0d769684e36e4cee83b26e8a2b42401b="admin"
1ba56baa693841199c21b822ccd21dd4="Support"

所以现在我试图通过(proj_id 之前定义)返回与 id 匹配的值:

  $projects = convertfrom-stringdata (get-content .\projects_hash.txt -raw)
  $proj_name = "$projects.$proj_id"
  Write-Host "Project name is $proj_name"

哪些输出:

Project name is System.Collections.Hashtable.2dbba23a878e47b19e6913315edfb3ef
Project name is System.Collections.Hashtable.3b4cb7dc3ebf4177b00bbee0c6bb5c12

如果我将行 $proj_name = $projects.$proj_id 更改为 $proj_name = $projects[$proj_id] 我得到这个输出:

Project name is System.Collections.Hashtable[3b4cb7dc3ebf4177b00bbee0c6bb5c12]

如何才能成功检索到与键匹配的值?

【问题讨论】:

  • 看起来你的文件projects.txt实际上是一个合适的csv文件。你为什么不这样对待它?我想这会让你的生活更轻松。 ;-)
  • 您需要将密钥括在引号中以将其用于查找。你可以使用$projects.'0d769684e36e4cee83b26e8a2b42401b' 来获取"admin" 如果你想去掉值上的引号,把它们从你的文件中删除。 ///// 顺便说一句,你为什么要使用这种迂回方法?您可以使用$Array.Where({}) 快速过滤 - 如果您的收藏相当小..
  • 就像@Olaf 所说,使用import-csv 会比你的获取内容方法容易得多:)
  • 而不是输出到projects_hash.txt 你应该把它变成一个json文件,它可以处理一些额外的东西:)。
  • 不要执行 foreach 循环的最后一行,而是尝试执行 $var=@" {"hash":"admin","hash2":"support"} "@ 然后 $var = $var |convertfrom-json 然后将 $var 输出到文件

标签: powershell hashtable


【解决方案1】:

如果我做对了并且源数据采用了您发布的格式,则您不必执行字符串杂技来将输入数据转换为可用格式。 ;-)

您可以使用 Import-Csv 导入源数据。

$SourceData = 
@'
"ID","Name"
"0d769684e36e4cee83b26e8a2b42401b","admin"
"1ba56baa693841199c21b822ccd21dd4","Support"
'@ |
    ConvertFrom-Csv

现在您已经拥有结构化数据,您可以按照自己的方式对其进行过滤。通过 ID ...

$DesiredID = "1ba56baa693841199c21b822ccd21dd4"
$SourceData | 
    Where-Object -Property ID -EQ -Value $DesiredID 

或按名称...

$DesiredName = "admin"
$SourceData | 
    Where-Object -Property Name -EQ -Value $DesiredName  

编辑:
只是要非常清楚这一点:我不建议使用 ConvertFrom-Csv。这只是为了使代码更容易从 SO 复制和运行。导入源数据的推荐方式如下:

$SourceData =
    Import-Csv -Path .\projects.txt -Delimiter ','

【讨论】:

    【解决方案2】:

    我个人建议@Olaf 的方法,但我在这里提供一种替代方法。

    您可以使用ConvertFrom-Json,而不是使用ConvertFrom-Csv,结果将相似。

    $jsonvar = @"
    {}
    "@
    $jsonvar = $jsonvar | ConvertFrom-Json
    foreach ($line in (Get-Content -encoding ASCII .\projects.txt | select-object -skip 1)){
      $proj_array = $line.split(',')
      $proj_id = $proj_array[0] -Replace '"',""
      $proj_name = $proj_array[1]
      $jsonvar | add-member -value "$proj_name" -name "$proj_id" -MemberType NoteProperty
    }
    $jsonvar | convertto-json > .\projects_hash.txt
    $tempo = get-content .\projects_hash.txt
    $projects = @"
    $tempo
    "@
    $projects = $projects | convertfrom-json
    $proj_name = $projects.$proj_id
    Write-Host "Project name is $proj_name"
    

    【讨论】:

      猜你喜欢
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      相关资源
      最近更新 更多