我在一位客户的多台机器上遇到一个问题:运行任何 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 后,问题得到解决。