我正在尝试通过PowerShell命令提示符启动一个命令,以将文本替换为文件。问题是,即使我的ErrorLevel命令不工作,我也总是得到PowerShell =0。我的问题是,当我通过ErrorLevel启动PowerShell时,如何将错误代码导入cmd
?请注意,我希望通过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的错误级别就会得到这个错误代码(我不想编写自己的代码)。那些有答案的人是受欢迎和感谢的,但是那些在这里只是通过要求改变我想要的东西来发表毫无帮助的评论,或者删除图片etc...please的人,除了提供帮助和回答我的问题而不是提出其他的建议之外,我是在寻求对一些具体的事情的帮助,请不要把话题改变到其他的事情上。这个网站的想法是提供帮助,而不是添加无用和无用的评论。
发布于 2016-04-29 17:14:45
在cmd.exe shell中尝试以下代码:
C:> powershell -noprofile -command " try { 1/0 } catch {exit 22}"
C:> echo %errorlevel%
22
因此,将命令添加到try块中。如果发生了调用非powershell命令的情况,则可以使用exit $LastExitCode
(但从try块内部)。
编辑
好的,我知道你的非工作代码是怎么回事,它从来没有通过槽捕捉块,因为Get-Content生成非终止性错误。你得小心点:
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
(这很少发生),这将无法工作,但在所有其他情况下都能工作。
发布于 2016-05-02 14:35:37
因此,根据我的评论来回答这个问题:
你得到的是零,因为这是你要传递的值。如果您想使用任何一个变量作为退出代码,则必须将它们设置为某个变量。
你对此的答复是:
@ShawnMelton,谢谢,但我还不太明白.我不想做我自己的错误代码或者个性化的错误管理!我只想知道,当我的powershell (代码、脚本等)发生错误时,Dos的错误级别就会得到这个错误代码(我不想编写自己的代码)。你能用代码来说明你的意思吗?我可能不明白你的评论?谢谢你的帮助,从你的角度来说,这很好。
如果您正在调用powershell.exe
,它将将退出代码返回到命令提示符,始终为零(0)。即使您执行不正确的PowerShell代码,也始终为零。powershell.exe
本身正在成功地执行传递给它的任何命令,因此除非可执行文件本身因某些原因而出错,否则总是得到零。如果希望PowerShell.exe
返回除零以外的其他内容,则需要在PowerShell命令中使用exit xx
,其中xx
是一个整数。
不尝试从命令提示符调用PowerShell的观点仍然有效,无论您是否想在这里使用它。您不能保证,即使使用类似exit 99
的工具,也不会始终覆盖返回zero...it的可执行文件。当我用Windows 10在笔记本电脑上试用它时,我得到了各种各样的结果。我可以说,我以前在生产中使用过技术,当我不得不从SSIS包调用PowerShell脚本时,它就达到了目的。但是,在这种情况下,我没有从批处理文件中调用它,所以它按预期工作。
发布于 2019-06-04 15:12:38
如果最后使用外部命令,它将设置错误级别。我引用的是"^“。
powershell echo hi ^| findstr hi2
或者你可以测试$?并以非零数字退出:
powershell 1/0; if (! $?) { exit 1 }
实际上,如果最后一个cmdlet引发一个错误(终止与否),它应该设置cmd错误级别。
您可以这样做,并以所犯错误的数量退出。
powershell $errorcount = $error.count; 1/0; echo hi; exit $error.count - $errorcount
脚本终止错误将设置错误级别:
powershell throw 'hi'
更多地思考最初的问题。如果不使用括号,错误级别将在找不到文件时设置,因为当前管道将有异常。但是输出文件必须是不同的。将其作为脚本运行不会产生相同的结果(unix也不会)。
powershell "get-content foo2 | foreach { $_ -replace 'a','b' } | set-content foo3"
get-content : Cannot find path 'C:\Users\admin\foo2' because it does not exist.
At line:1 char:1
+ get-content foo2 | foreach { $_ -replace 'a','b' } | set-content foo3
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Users\admin\foo2:String) [Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
echo %errorlevel%
1
https://stackoverflow.com/questions/36943318
复制相似问题