有没有办法判断脚本是否使用 Invoke-Expression 调用而不是直接调用?如果脚本被直接调用,我想做一些不同的事情,例如暂停输入,但如果脚本是从另一个位置调用的,则跳过该操作。
答案1
简而言之,我的答案是“不”。
相反,您应该以这样一种方式来构造代码,以便您可以告知代码它应该或不应该提示,比如使用参数-Prompt
或其他东西。
如果没有看到代码或者不知道您要做什么,我真的无法提供更具体的建议。
答案2
使用 Invoke-Expression 我发现的一种方法是使用 Get-PSCallStack。
例如,如果我有一个名为 foo1.ps1 的脚本,我将以下内容输入:
$CallStack = Get-PSCallStack | select -ExpandProperty Command
$CallStack[($CallStack.count-2)]
然后创建第二个脚本,名为 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 }
它将显示您直接调用它或者返回调用它的脚本的路径(例如 foo2.ps1)。