Powershell 总是以退出代码 1 退出

Powershell 总是以退出代码 1 退出

我在一位客户的多台机器上遇到一个问题:运行任何 PowerShell 脚本时,进程始终以 exitcode 退出1,除非在脚本中明确指定了 exitcode(例如exit 0)。

  • 据我所知,0当脚本成功运行时,该过程应该以 exitcode 退出,当我在我自己的机器上或该客户之外的任何服务器上运行该脚本时,exitcode 是0
    # Run something to set current errorlevel to 0
    > ver
      Microsoft Windows [Version 6.3.9600]
    
    # Show what's in my test script
    > type test.ps1
      Write-Host testing
    
    > echo %ERRORLEVEL%
      0
    
    # Run the testscript
    > powershell -NoProfile -NonInteractive -NoLogo ./test.ps1
      testing
    
    # Print errorlevel
    > echo %ERRORLEVEL%
      1
    

有谁知道我该如何解决这个问题?

答案1

(继续我的评论)

这是两件完全不同的事情:

  • > type test.ps1
      Write-Host testing
    
    > echo %ERRORLEVEL%
      0
    
    这只是使用Get-Content(如果您在 PowerShell 控制台中,而不是cmd.exe)来显示脚本中的文本:
    • 因此这里运行的命令Get-Content不是你的脚本代码
    • 除非你在 cmd 提示符下执行此操作,否则它是 DOS 类型的内部命令,根本不是 Powershell

  • > powershell -NoProfile -NonInteractive -NoLogo ./test.ps1
      testing
    
    > echo %ERRORLEVEL%
      1
    
    • powershell.exe这实际上是通过调用来运行脚本cmd.exe,而不是进行同类比较,从而导致错误的结果。
    • 在 PS shell 中执行echo %ERRORLEVEL%是没有意义的,因为 PS 不知道%ERRORLEVEL%该使用上下文中有什么;要查看最后一个错误,请使用 PS 系统错误变量,而不是CMD.exe/DOS 内容。

您发布的代码是您在中执行的所有操作cmd.exe,而不是 PowerShell;ver是 DOS 内部命令,而不是 PowerShell 命令:

  • ver /?
    
      Displays the Windows version.
    
    Get-CimInstance -ClassName CIM_OperatingSystem
    
      SystemDirectory     Organization BuildNumber RegisteredUser SerialNumber            Version
      ---------------     ------------ ----------- -------------- ------------            -------
      C:\WINDOWS\system32              19043       Test00         00000-00000-00000-AAOEM 10.0.19043
    
  • 仅限版本:
    (Get-CimInstance -ClassName CIM_OperatingSystem).Version
    
      10.0.19043
    

也可以看看:从 PowerShell 脚本返回退出代码

答案2

更新至最新版本的 powershell 后,问题得到解决。

相关内容