脚本中的代码有所不同,具体取决于从另一个脚本或shell调用

我正试图区分脚本A中的代码,这是从另一个脚本B中调用脚本A时的代码,而不是它自己运行时的代码。

脚本A

$callingScript = $Myinvocation.MyCommand.Source | Split-Path -Leaf
if($callingScript -eq "$($Myinvocation.MyCommand.Name)"){
    # Script is run from Shell
}else{
    # Skript is called from script B.ps1
}

脚本B

(...)
& "$($PSScriptRoot)\A.ps1" 

结果始终是$callingScript是A.ps1,而Name也是A。 任何想法如何做到这一点?

mj5an 回答:脚本中的代码有所不同,具体取决于从另一个脚本或shell调用

应该起作用:
脚本-A.ps1

if ($MyInvocation.InvocationName -eq $MyInvocation.MyCommand.Source)
{
    Out-Host -InputObject ('Script startet with: ' + $MyInvocation.InvocationName)
}
else
{
    Out-Host -InputObject ('Script startet with: ' + $MyInvocation.ScriptName)
}

Script-B.ps1

& C:\Temp\Script-A.ps1

输出:

PS C:\> C:\Temp\Script-A.ps1
Script startet with: C:\Temp\Script-A.ps1
PS C:\> C:\Temp\Script-B.ps1
Script startet with: C:\Temp\Script-B.ps1

实际上,我将使用输入参数(开关)来识别情况,因为仅当您在ISE中使用F5执行文件或直接在powershell.exe中运行脚本时,以上方法才有效。

,

在脚本中,$MyInvocation.PSCommandPath包含:

  • 调用脚本的完整路径-如果有的话。

  • 否则为空字符串;也就是说,如果直接从PowerShell提示符或通过CLI调用脚本,则返回空字符串。-powershell.exe(Windows PowerShell)/ pwsh(PowerShell Core)

因此:

if (-not $MyInvocation.PSCommandPath){
  # Script was called from the PowerShell prompt or via the PowerShell CLI.
  'DIRECT invocation'
}
else {
  # Script was called from the script whose path is reflected in
  # $MyInvocation.PSCommandPath
  'Invocation VIA SCRIPT'
}

注意

  • 据我所知,$MyInvocation.ScriptName包含与$MyInvocation.PSCommandPath相同的信息;我选择上面的后者是为了与$PSCommandPath

  • 对称 关于这些属性,
  • 功能被忽略了-重要的只是封闭脚本

    • 但是,Get-PSCallStack的输出也反映了功能。

    • 如果您点源一个脚本(. ./script.ps1),该脚本定义了一个调用目标脚本的函数,随后又调用了该函数,$MyInvocation.PSCommandPath仍会反映原产地脚本-无论您从何处调用该功能(即使您直接从提示符下或通过另一个脚本进行调用)

本文链接:https://www.f2er.com/3137325.html

大家都在问