有没有办法告诉脚本是否使用Invoke-Expression调用,而不是直接调用? 我想要做一些不同的事情,例如,如果直接调用脚本,则暂停input,如果正在从另一个位置调用该脚本,则跳过该步骤。
总之,我会说不。
相反,你应该以这样一种方式构造代码,以便通知代码它应该或不应该提示,例如使用-Prompt参数或其他东西。
没有看到代码或知道你在做什么,我不能给出更具体的build议。
使用Invoke-Expression我发现的一种方法是使用Get-PSCallStack。
例如,如果我有一个名为foo1.ps1的脚本,
$CallStack = Get-PSCallStack | select -ExpandProperty Command $CallStack[($CallStack.count-2)]
然后创build一个名为foo2.ps1的第二个脚本,它只包含:
Invoke-Expression .\foo1.ps1
如果我直接在PS提示符下运行foo1.ps1,它将返回foo1.ps1,如果我运行foo2.ps1,则会返回该脚本名称。
我发现另一种方法是使用$ MyInvocation,但似乎不适用于Invoke-Expression。 如果你只是简单地用“&。\ foo1.ps1”或甚至“。\ foo1.ps1”来调用脚本,它就可以工作。 用这种方法,如果你把以下内容放在foo1.ps1中:
if ($MyInvocation.ScriptName -eq "") {Write-Host "Run directly"} else {Write-Host "Called from " $MyInvocation.ScriptName }
它会显示你直接调用它或者返回path到脚本(例如foo2.ps1),它调用它。