如何从PowerShell中将错误代码(ErrorLevel)导入Windows命令提示符?

时间:2016-04-29 16:27:43

标签: 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"
  

基于majkinetor的评论,我尝试了以下内容并且也没有工作:(即使在PowerShell中发生错误,我仍然在Dos中获得ErrorLevel 0。

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

5 个答案:

答案 0 :(得分:4)

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

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

C:> echo %errorlevel%
22

因此,在try块中添加命令。如果您调用non powershell命令,则可以exit $LastExitCode(但在try块内)。

修改

好的,我知道您的非工作代码发生了什么,它从未通过catch块传递,因为Get-Content产生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 stop。也许最简单的通用解决方案不依赖于脚本:

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

如果相关脚本更改$ErrorActionPreference(很少发生)但在所有其他情况下都可以使用,则无效。

答案 1 :(得分:0)

所以根据我的评论将其作为答案:

  

你得到零,因为这是你传递的价值。如果你   想要使用你的任何一个变量作为你必须的退出代码   把它们设置成某种东西。

您回复了:

  @ShawnMelton谢谢,但我还没有把它弄好......我不想做   我自己的错误代码或个性化的错误管理!我想要的只是   当我的powershell(代码,脚本等)发生错误时,   Dos的错误级别得到这个错误代码(我不想让我的   自己的代码)。你能用代码说明你的意思吗?我可能有   不明白你的评论?感谢您试图帮助它变得更好   你的身边。

由于您正在调用powershell.exe,它将返回退出代码返回命令提示符,始终为零(0)。即使您执行不正确的PowerShell代码,它也始终为零。 powershell.exe本身正在成功执行您传递给它的任何命令,因此除非可执行文件本身由于某种原因而出错,否则总是为零。如果您希望PowerShell.exe返回零以外的内容,则需要在PowerShell命令中使用exit xx,其中xx是整数。 enter image description here

无论你是否愿意,从命令提示符调用PowerShell的观点仍然存在。你无法保证即使使用像exit 99这样的东西也总会覆盖返回零的可执行文件......它只是它的工作方式。当我在使用Windows 10的笔记本电脑上试用它时,我得到了各种结果。我可以说我在生产之前使用过技术,当我不得不从SSIS包中调用PowerShell脚本时,它就达到了目的。但是在那种情况下,我没有从批处理文件中调用它,因此它按预期工作。

答案 2 :(得分:0)

如果最后使用外部命令,它将设置错误级别。我用“ ^”引用管道。

powershell echo hi ^| findstr hi2

或者您可以测试$?并以非零数字退出:

powershell 1/0; if (! $?) { exit 1 } 

实际上,如果LAST cmdlet引发错误(是否终止),则应设置cmd错误级别。

您可以执行类似的操作,然后退出并显示错误数量。

powershell $errorcount = $error.count; 1/0; echo hi; exit $error.count - $errorcount

答案 3 :(得分:0)

@majkinetor的建议肯定有效。我的意思是这个:

powershell -Command "try {(gc "C:\test.txt" -ea stop) -creplace 'test', 'work' | Out-File -encoding ASCII "C:\test.txt" -ea stop} catch{ exit 1}"

如果文件路径正确,则替换该字符串。如果文件路径不正确,则使用上述代码段将cmd会话中的错误级别设置为1。

我遇到的问题是我希望此操作使Jenkins构建失败。我使用构建步骤执行Windows批处理命令,诀窍是,如果您希望它因错误而失败,则只需要上述命令即可。如果此后又有一个成功,则说明构建成功。

答案 4 :(得分:0)

考虑使用选项-文件代替-命令。 通过使用-file选项,您将获得在代码中指定的任何值, 而-command选项将为您提供0或1。

尝试这种情况:

cmd.exe

cd%userprofile%\ desktop

echo $ temp = 999;写主机$ temp;退出$ temp> test.ps1

回声%errorlevel%

0

powershell。\ test.ps1

999

回声%errorlevel%

1

powershell -command。\ test.ps1

999

回声%errorlevel%

1

现在...

powershell -文件。\ test.ps1

999

回声%errorlevel%

999

祝你好运!