當流式傳輸到 ForEach-Object 時,這個轉換為 powershell 物件的 JSON 陣列似乎以某種方式被處理為單個字串。
"[1, 2, 3]" | ConvertFrom-Json | ForEach-Object {Write-Host "Number: $_"}
印刷:
Number: 1 2 3
期待:
Number: 1
Number: 2
Number: 3
雖然:“[1,2,3]”| ConvertFrom-Json
印刷:
1
2
3
我當然想用 Azure CLI 做一些更復雜的事情,但這個問題浪費了我很多時間。
實際上,像這樣設定括號似乎可以按我的預期作業:
("[1, 2, 3]" | ConvertFrom-Json) | ForEach-Object {Write-Host "Number: $_"}
并輸出:
Number: 1
Number: 2
Number: 3
這是powershell中的管道問題還是我只是不了解powershell中的管道。
我的powershell版本如下:
> $PSversionTable
Name Value
---- -----
PSVersion 5.1.22000.282
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.22000.282
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
uj5u.com熱心網友回復:
這是設計使然,ConvertFrom-Json顯式請求運行時的 Windows PowerShell 版本不會立即列舉陣列輸出(Write-Output $array -NoEnumerate基本上)。
原因是,如果允許 PowerShell 的默認管道列舉行為,則具有頂級單項陣列的 JSON 檔案[1]將與檔案無法區分。1
如何解決這種行為?
正如您所發現的,您可以通過嵌套以 結尾的管道來解決此問題ConvertFrom-Json,使用分組運算子(...)或子運算式運算子$(...)或@(...):
("[1, 2, 3]" | ConvertFrom-Json) | ForEach-Object {Write-Host "Number: $_"}
# or
@("[1, 2, 3]" | ConvertFrom-Json) | ForEach-Object {Write-Host "Number: $_"}
# or
$("[1, 2, 3]" | ConvertFrom-Json) | ForEach-Object {Write-Host "Number: $_"}
您還可以將另一個命令插入管道 - 不列舉陣列輸出的請求僅影響直接下游命令,而不影響管道的其余部分:
"[1, 2, 3]" | ConvertFrom-Json | ForEach-Object { $_ } | ForEach-Object {Write-Host "Number: $_"}
# ^ ^
# This one will not enumerate output |
# But this one will
或者,如果可能,升級到最新版本的 PowerShell。ConvertFrom-Json在 PowerShell 7.x 中已更新,因此它:
- 默認不再要求無輸出列舉
- 允許用戶使用
-NoEnumerate引數控制行為:
# This will work as you expected in PowerShell 7
"[1, 2, 3]" | ConvertFrom-Json | ForEach-Object {Write-Host "Number: $_"}
# This will work the same as Windows PowerShell in PowerShell 7
"[1, 2, 3]" | ConvertFrom-Json -NoEnumerate | ForEach-Object {Write-Host "Number: $_"}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/426812.html
