是否可以在 PowerShell 中創建匿名遞回函式?(如果是,如何?)
我有一個遞回物件并使用遞回函式來深入了解屬性,例如:
$Object = ConvertFrom-Json '
{
"Name" : "Level1",
"Folder" : {
"Name" : "Level2",
"Folder" : {
Name : "Level3"
}
}
}'
Function GetPath($Object) {
$Object.Name
if ($Object.Folder) { GetPath $Object.Folder }
}
(GetPath($Object)) -Join '\'
Level1\Level2\Level3
該函式相對較小,只有必需的,因此我想直接將其作為匿名函式呼叫,例如:
(&{
$Object.Name
if ($Object.Folder) { ???? $Object.Folder }
}) -Join '\'
這在 PowerShell 中可行嗎?如果是,我如何(盡可能干凈)參考當前函式????
?
uj5u.com熱心網友回復:
不幸的是,關于這個主題的檔案不多,但您可以通過呼叫來執行匿名腳本塊$MyInvocation.MyCommand.ScriptBlock
,這是一個簡單的示例:
& {
param([int] $i)
if($i -eq 10) { return $i }
($i )
& $MyInvocation.MyCommand.ScriptBlock $i
}
# Results in 0..10
以您當前的代碼和 Json 為例:
(& {
param($s)
$s.Name
if ($s.Folder) { & $MyInvocation.MyCommand.ScriptBlock $s.Folder }
} $Object) -Join '\'
# Results in Level1\Level2\Level3
更多代碼,但同樣可以使用 aCollections.Queue
而不是遞回來完成,這可能是一種更節省資源的方式:
$(
$queue = [System.Collections.Queue]::new()
$queue.Enqueue($object)
while($queue.Count) {
$node = $queue.Dequeue()
$node.Name
if($node.Folder) { $queue.Enqueue($node.Folder) }
}
) -Join '\'
uj5u.com熱心網友回復:
@Santiago的有用答案正是我最初尋找的地方。
然而,它并不總是需要遞回函式來爬取遞回物件。
就像在mcve中一樣,我本可以這樣做:
@(
do {
$Object.Name
$Object = $Object.Folder
} while ($Object)
) -Join '\'
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/470936.html