我正在嘗試構建一個 json 檔案,該檔案將用于我們的各種腳本以獲取我們的服務器詳細資訊。相同的腳本將在我們所有包含多個產品和組件的環境中使用。這是我正在使用的那種 json 檔案:
{
"DEV" : {
"Product1" : [
{"serverName" : "hostname1", "isWebServer" : "true"},
{"serverName" : "hostname2", "isWebServer" : "false"}
],
"Product2" : [
{"serverName" : "hostname3", "isWebServer" : "false"},
{"serverName" : "hostname4", "isWebServer" : "true"}
]
}
}
JSON檔案被匯入到一個變數中,我能夠成功使用它。
$jsonFile = Get-Content -Path "C:\temp\test.json" -Raw | ConvertFrom-Json
我在我的 PowerShell 腳本中嘗試做的是獲取所有使用密鑰配置的 serverName"isWebServer" : "true"
如果我直接深入研究每個陣列,我可以成功實作我的目標。
($jsonFile.DEV.Product1 | Where-Object {$_.isWebServer -eq "true"}).serverName
但是,當我想從整個 DEV 環境中獲取所有 Web 服務器時,我無法取得同樣的成功。我正在尋找這樣的東西,但實際上會回傳一些東西。
($jsonFile.DEV | Where-Object {$_.isWebServer -eq "true"}).serverName
如何獲取物件內所有陣列下的所有內容?我已經習慣了 XPATH,在這種情況下我可以使用通配符,但我還沒有在 JSON 中找到等價的。
uj5u.com熱心網友回復:
這是一個可能的解決方案:
$json.DEV.PSObject.Properties.Value.Where{ $_.isWebServer -eq 'true' }.serverName
hidden ( intrinsic )PSObject成員允許我們訪問物件的屬性 ( Product1, Product2, ...) DEV,而無需事先知道它們的名稱。
然后,使用成員訪問列舉,我們得到一個包含存盤在Value中的物件的所有成員的陣列。PSPropertyInfoPSObject.Properties
為了過濾服務器物件,內部方法Where用于僅回傳與給定條件匹配的服務器。隨意使用Where-Object:
$json.DEV.PSObject.Properties.Value |
Where-Object isWebServer -eq 'true' |
ForEach-Object serverName
盡管我更喜歡內部方法,因為它們比管道更快(開銷更少)并且撰寫起來更簡潔。
uj5u.com熱心網友回復:
它看起來與我很久以前所做的相似。看看這是否有幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/466236.html
標籤:json 电源外壳 powershell-5.1 从 json 转换
上一篇:函式輸出型別
