测试 PowerShell 脚本是否使用 Invoke-Expression 调用?

测试 PowerShell 脚本是否使用 Invoke-Expression 调用?

有没有办法判断脚本是否使用 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)。

相关内容