我有以下代码:
function foo () {
$sb = (Get-Command bar -CommandType Function).ScriptBlock
Invoke-Command -ScriptBlock $sb
}
function bar () {
demo
}
function demo () {
Write-Host $((Get-PSCallStack)[0].Command)
Write-Host $((Get-PSCallStack)[1].Command)
}
foo
结果是:
foo
demo
我想得到的是:
bar
demo
问题似乎是在函数foo中,我使用Invoke-Command cmdlet调用了函数栏,而powershell将此视为demo的调用函数。据我了解,功能栏正在调用demo,而不是foo。
我无法弄清楚为什么Powershell会那样表现,以及如何到达Powershell向我返回函数名称“bar”的地步。
甚至我说“愚弄” PowerShell的想法都说:
function bar () {
$sb = (Get-Command demo -CommandType Function).ScriptBlock
Invoke-Command -ScriptBlock $sb
}
并未导致有关“酒吧”的任何成功。
我正拼命地呼吁您的帮助。
最佳答案
在问题注释中,听起来好像是通过简化方法解决了原始问题。但是我认为我偶然发现了这个问题的答案。我在演示代码中将.Command
更改为.FunctionName
:
function foo () {
$sb = (Get-Command bar -CommandType Function).ScriptBlock
Invoke-Command -ScriptBlock $sb
}
function bar () {
demo
}
function demo () {
Write-Host $((Get-PSCallStack)[0].FunctionName)
Write-Host $((Get-PSCallStack)[1].FunctionName)
}
foo
现在,输出显示所需的
bar
(而不是foo
):demo
bar
关于function - 获取Powershell中调用函数的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44028556/