簡體   English   中英

Powershell:當鍵是變量時,無法從文件中訪問值

[英]Powershell: Can't access value from file when key is a variable

當鍵是變量時,我似乎無法返回與鍵匹配的值。

我從一個名為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"

所以現在我試圖返回與 id 匹配的值( proj_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]我得到這個 output:

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

如何成功檢索與鍵匹配的值?

如果我做對了並且源數據采用了您發布的格式,則您無需執行字符串雜技即可將輸入數據轉換為可用格式。 ;-)

您可以使用 Import-Csv 導入源數據。

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

現在您已經擁有結構化數據,您可以按照自己的方式對其進行過濾。 不管是身份證...

$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 ','

我個人會建議@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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM