gpt4 book ai didi

powershell - 使用正确的退出代码报告从 PowerShell 调用批处理文件,同时避免插入符号加倍

转载 作者:行者123 更新时间:2023-12-03 22:59:41 24 4
gpt4 key购买 nike

我怀疑没有好的解决方案,但也许我忽略了一些东西:
我所追求的是一种方法:

  • (a) 从 PowerShell 调用批处理文件,以在 PowerShell 的自动 $LASTEXITCODE 中稳健地反射(reflect)其(隐式或显式)退出代码的方式。多变的。
  • 值得注意的是,调用一个以 whoami -nosuch || exit /b 退出的批处理文件。 , 应该导致 $LASTEXITCODE反射 whoami的退出代码,即 1 .当您从 PowerShell 调用批处理文件(按名称或路径)时,情况并非如此:退出代码是 0 (相比之下,在 cmd.exe session 中 %ERRORLEVEL% 设置为 1 )。
  • 另请注意,调用应与 PowerShell 的输出流保持集成,因此我不是在寻找基于 System.Diagnostics.Process 的解决方案。 .
  • 此外,我不知道或控制被调用的批处理文件 - 我正在寻找通用解决方案。

  • (b) 没有以任何方式改变传递给批处理文件的双引号参数,并且没有 cmd.exe的行为以任何方式改变;尤其:
  • ^字符不应加倍(见下文)。
  • 使用 /V:ON 启用延迟扩展不是一个选择。


  • 我知道如何解决 (a) 的唯一方法是通过 cmd /c call 调用批处理文件.
    不幸的是,这违反了要求 (b),因为使用了 call似乎总是翻倍 ^参数中的字符。 (相反,如果不使用 call,则不会可靠地报告退出代码)。
    有没有办法同时满足这两个要求?
    请注意,PowerShell 只是这里的信使:问题出在 cmd.exe ,以及任何从 cmd.exe 外部调用批处理文件的人session 也面临同样的问题。

    示例(PowerShell 代码):
    # Create a (temporary) batch file that echoes its arguments,
    # provokes an error, and exits with `exit /b` *without an explicit argument*.
    '@echo off & echo [%*] & whoami -nosuch 2>NUL || exit /b' | Set-Content test.cmd

    # Invoke the batch file and report the exit code.
    .\test.cmd "a ^ 2"; $LASTEXITCODE
    输出应该是:
    ["a ^ 2"]
    1
    但是,实际上没有报告退出代码:
    ["a ^ 2"]
    0 # !! BROKEN
    如果我调用 cmd /c call .\test.cmd相反,退出代码是正确的,但 ^字符加倍:
    PS> cmd /c call .\test.cmd "a ^ 2"; $LASTEXITCODE
    ["a ^^ 2"] # !! BROKEN
    1 # OK

    最佳答案

    我不知道为什么会这样,但确实如此:

    cmd /c '.\test.cmd "a ^ 2" & exit'
    $LASTEXITCODE
    输出:
    ["a ^ 2"] 
    1

    关于powershell - 使用正确的退出代码报告从 PowerShell 调用批处理文件,同时避免插入符号加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66975883/

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