【问题标题】:Determine if PowerShell script has been dot-sourced确定 PowerShell 脚本是否已点源
【发布时间】:2018-03-11 05:27:25
【问题描述】:

从 PowerShell 脚本中,我如何确定该脚本是否是点源的,即它是否已被调用

. .\myscript.ps1

而不是

.\myscript.ps1

注意一篇关于此的有趣博文(也):http://poshoholic.com/2008/03/18/powershell-deep-dive-using-myinvocation-and-invoke-expression-to-support-dot-sourcing-and-direct-invocation-in-shared-powershell-scripts/

【问题讨论】:

    标签: powershell


    【解决方案1】:

    检查 $myinvocation.line 它将显示用于调用脚本的行。

     PS C:\scripts\test> gc test.ps1
     $myinvocation.line
    
     PS C:\scripts\test> ./test.ps1
     ./test.ps1
    
     PS C:\scripts\test> . ./test.ps1
     . ./test.ps1
    

    您还可以检查 .invocationname 属性。如果脚本是点源的,那么它将只是一个点。如果没有,就是 ./scriptname.ps1

    【讨论】:

    • 谢谢,InvocationName 正是我想要的。
    • .Invocationname 似乎是最好的,“line”的第一个字符可能是一个具有相对路径的点 ..\test.ps1 当不是点源时,或者当点源时下一个字符可能不是空间。 (括号,引号,$(等)然后在下面添加@mklement0异常。
    • 我认为检查脚本是否是点源的更好的解决方案是检查$MyInvocation.CommandOrigin -ieq 'Internal'。但你做到了。
    【解决方案2】:

    补充mjolinor's helpful answer

    tl;dr

    $isDotSourced = $MyInvocation.InvocationName -eq '.' -or $MyInvocation.Line -eq ''
    

    虽然$MyInvocation.InvocationName -eq '.' 大部分会告诉您给定脚本是否是点源代码,但有一个例外

    [至少适用于 PowerShell v3]
    当您使用 Debug > Run/Continue (F5) 从 Visual Studio CodePowerShell ISE 运行脚本时,它是隐式 em> 来源,但 $MyInvocation.InvocationName 包含完整的脚本文件名而不是 . 但是,您可以通过检查 $MyInvocation.Line 是否为 empty 来检测这种情况。

    【讨论】:

    • 太好了,我花了很多时间从 LINE 中确定这个(由于各种奇怪的异常),你们很简单,甚至是我不知道的异常。谢谢
    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多