windows - 如何从 PowerShell 获取错误代码 (ErrorLevel) 到 Windows 命令提示符?

标签 windows powershell cmd errorlevel

我正在尝试通过 Windows 命令提示符启动 PowerShell 命令以将文本替换为文件。问题是即使我的 PowerShell 命令不起作用,我也总是得到 ErrorLevel = 0。 我的问题是当我通过 cmd 启动 PowerShell 时如何将错误代码放入 ErrorLevel? 请注意,我想通过 Windows 命令提示符而不是通过创建脚本来实现这一点。

这是我所说的一个例子。打印屏幕中的错误是通过选择一个不存在的文件故意造成的,以向您显示即使出现错误,ErrorLevel 也等于 0。

我使用的命令如下(我尝试了 $LastExitCode$ExitCode):

powershell -NonInteractive -NoProfile -Command "(Get-Content HvsvmAppserver.ref) -replace '-Dfr.base0.role=', '-Dfr.base0.role=USR_ROLE'| Set-Content -encoding ASCII HvsJvmAppserver.ref; exit $LastExitCode"

但我也尝试过同样的方法:

powershell -NonInteractive -NoProfile -Command "(Get-Content HvsvmAppserver.ref) -replace '-Dfr.base0.role=', '-Dfr.base0.role=USR_ROLE'| Set-Content -encoding ASCII HvsJvmAppserver.ref; exit $ExitCode"

Based on the comment of majkinetor, I tried the following and hasn't work as well :(, I am keep getting ErrorLevel 0 in Dos even when an error occurs in powershell.

powershell -noprofile -command " try { (Get-Content HvsvmAppserver.ref) -replace '-Dfr.base0.role=', '-Dfr.base0.role=USR_ROLE'| Set-Content -encoding ASCII HvsJvmAppserver.ref } catch {exit $LastExitCode}"

可以明显看到文件名不存在相关的错误,但是错误级别一直是0。

我想要的是为执行 PowerShell 命令时发生的每个错误获取 0 以外的错误代码。

根据我读到的一些评论,我想说:我想通过 PowerShell 和 Dos 命令来实现它,而不是用其他方式。我不想制作我自己的错误代码或个性化的错误管理!我想要的只是当我的 powershell(代码、脚本等)发生错误时,Dos 的错误级别得到这个错误代码(我不想制作自己的代码)。 欢迎那些有答案的人并感谢他们,但是那些在这里只是通过要求更改我想要的内容或删除图片等来发表无用评论的评论......请不要发表评论,除非提供帮助和回答我的问题不是通过提出其他建议,我正在寻求有关特定问题的帮助,请不要将主题更改为其他内容。本网站的想法是提供帮助,而不是添加无用的和无益的评论。

Error 2

最佳答案

在 cmd.exe shell 中尝试此代码:

C:> powershell -noprofile -command " try { 1/0 } catch {exit 22}"

C:> echo %errorlevel%
22

因此,在 try block 中添加您的命令。如果碰巧您调用了非 powershell 命令,您可以退出 $LastExitCode(但从 try block 内)。


编辑

好的,我知道您的非工作代码发生了什么,它从未通过 Get-Content 生成的 catch block non-terminating error .你必须注意这一点:

C:> Powershell -Command "try { (Get-Content HvsvmAppserver.ref -ea stop) -replace '-Dfr.base0.role=', '-Dfr.base0.role=USR_ROLE'| Set-Content -encoding ASCII HvsJvmAppserver.ref -ea stop } catch {$_; exit 123 }"

Get-Content : Cannot find path 'C:\Users\majkinetor\HvsvmAppserver.ref' because it does not exist.
At line:1 char:8
+ try { (Get-Content HvsvmAppserver.ref -ea stop) -replace '-Dfr.base0. ...
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Users\majkinetor\HvsvmAppserver.ref:String) [Get-Content], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

C:> echo %errorlevel%
123

请注意我添加到两个命令中的 -ea stop(比 ErrorAction 更短)。我的解决方案第一次是正确的,但是,您需要了解脚本也必须正确设计。您可能还想使用 trap 而不是 catch,但您仍然必须使用 EA 停止。也许不太依赖脚本的最短通用解决方案是:

   $ErrorActionPreferance = 'Stop'
   <your script goes here, no need for -ea stop in it>
   trap { exit 123 }

如果有问题的脚本更改了 $ErrorActionPreference(这种情况很少发生),这将不起作用,但在所有其他情况下都可以。

关于windows - 如何从 PowerShell 获取错误代码 (ErrorLevel) 到 Windows 命令提示符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36943318/

相关文章:

windows - 如何仅使用 Windows 命令 shell 查找文件大小?

jquery - IE9 简单的点击/滚动问题

powershell - 如何在 PowerShell 中用 %20 替换空格?

Powershell - 自定义对象中的多个值

powershell - 如何在控制台中输出正在复制的文件?

windows - CALL 通过时百分号消失

batch-file - 从 Jenkins 执行 windows 批处理命令失败,但在 cmd.exe 中运行良好

windows - 使用Pester检查Windows磁盘加密

php - 使路径在 linux 和 Windows 上都有效

c - _aenvptr 和 _wenvptr 的重复定义