gpt4 book ai didi

Powershell 奇怪的错误处理行为

转载 作者:行者123 更新时间:2023-12-03 00:01:32 25 4
gpt4 key购买 nike

我发现关于 Powershell 错误的一个非常奇怪的事情。考虑以下脚本:

function ProduceError {
[CmdletBinding()]
param()
#write-error a1
#throw "a2"
#a3.exe
}

function TestError {
ProduceError -ea stop
ProduceError -ea stop
}

TestError

我调用 ProduceError带有停止首选项的 cmdlet,因此无论发生终止错误还是非终止错误,它的行为都应该相同,但事实并非如此。

这是我在 Powershell v3 中观察到的(确保 a3.exe 不存在):
  • 取消注释 write-error :它会打印一次 a1 然后停止。
  • 取消注释 throw :它会打印一次 a2 然后停止。
  • 取消注释 a3.exe : 会提示两次关于找不到a3.exe。

  • 为什么调用不存在的命令似乎会导致非终止错误,即使我将错误首选项设置为停止? (我知道我可以将 EA 设置为在 TestError 内停止,但我想知道 ProduceError 内不一致的原因。)

    最佳答案

    这是一个范围界定问题,请参阅 about_Scopes .

    发生这种情况是因为您隐式使用调用运算符 &调用a3.exe时.您可以通过更改代码以显式使用它来证明这一点:

    function ProduceError {
    [CmdletBinding()]
    param()
    & a3.exe
    }

    这将产生相同的行为。正如帮助页面所说:

    When you use the call operator (&) to run a function or script, it is not added to the current scope. The following example uses the call operator:



    & c:\scripts.sample.ps1

    Any aliases, functions, or variables that the Sample.ps1 script creates are not available in the current scope.



    要解决这个问题,您可以使用 Invoke-ExpressionStart-Process :

    function ProduceError {
    [CmdletBinding()]
    param()
    Invoke-Expression a3.exe
    }

    或者

    function ProduceError {
    [CmdletBinding()]
    param()
    Start-Process a3.exe
    }

    这些应该按您期望的方式工作,因为 cmdlet 在您的范围内。

    根据您的评论进行编辑:

    使用调用运算符不会创建子范围(或子范围),它是一个新 session :

    Sessions, modules, and nested prompts are self-contained environments, but they are not child scopes of the global scope in the session.

    Sessions: A session is an environment in which Windows PowerShell runs. When you create a session on a remote computer, Windows PowerShell establishes a persistent connection to the remote computer. The persistent connection lets you use the session for multiple related commands.

    Because a session is a contained environment, it has its own scope, but a session is not a child scope of the session in which is was created. The session starts with its own global scope. This scope is independent of the global scope of the session. You can create child scopes in the session. For example, you can run a script to create a child scope in a session.

    关于Powershell 奇怪的错误处理行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26703685/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com