我正在研究一個遞回函式來比較兩個 JSON 物件并遇到了一個奇怪的問題。我的遞回作業正常......直到我將遞回呼叫的結果分配給一個變數。如果我只是進行函式呼叫,則遞回有效,并且所有成員都被迭代。當賦值存在時,遞回中斷并且只迭代物件的第一級。
(帶箭頭的線表示遞回呼叫)
有什么原因這不起作用嗎?
function Compare-Objects() {
[CmdletBinding()]
Param(
$Current,
$Expected
)
foreach ($Property in $Expected.PSObject.Properties) {
$Property.Name " : " $Property.TypeNameOfValue
if ($Property.TypeNameOfValue -like "*PSCustomObject") {
-> $Match = Compare-Objects -Current $Current.$($Property.Name) -Expected $Expected.$($Property.Name)
}
elseif ($Property.TypeNameOfValue -like "*Object[[][]]"){
# Compare-Arrays -Current $Current.$($Property.Name) -Expected $Expected.$($Property.Name)
}
else {
if ($Property.Value -like "*enums*") {
$Expected.$($Property.Name) = Invoke-Expression -Command $Expected.$($Property.Name)
}
if ($Current.$($Property.Name) -ne $Expected.$($Property.Name)) {
return $false
}
}
}
return $true
}
uj5u.com熱心網友回復:
使用變數賦值 () 的副作用$Match = ...是被賦值的值不再受 PowerShell 的隱式輸出行為的影響,即它不會發送到陳述句/函式/腳本 [塊] 的成功輸出流,因此不會更長的時間有助于其“回報價值”。
換句話說:你的遞回作業得很好,你只是不小心抑制了嵌套呼叫的輸出。
如果要將命令輸出分配給變數并將分配的值傳遞給成功輸出流,請將其括在 中(...),即使用($Match = ...)
另外,如果您想繞過成功輸出流,例如列印不干擾資料輸出的狀態/除錯資訊:
您可以使用 cmdlet (例如和)寫入 PowerShell 的其他輸出流,僅在請求時才會生成可見輸出。
Write-VerboseWrite-Debug相比之下,
Write-Hostcmdlet(主要用于顯示輸出,通常包括格式化(著色))默認生成可見輸出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/440055.html
上一篇:遞回查找物件屬性的路徑
