从CMD返回错误代码到Powershell

7

我正在编写一个Mssql安装脚本,想要获取无人值守的Mssql安装结果。在我的PowerShell脚本中,我运行了以下命令:

$result = (start cmd "/c D:\SQL2008R2\SQL2008R2\setup.exe /CONFIGURATIONFILE=sqlconfig.ini && exit 0 || exit 1")

这个应该在失败时返回0,在通过时返回1。不幸的是,我没有得到任何输出。有什么想法吗?


这不是 && 的工作方式,而且在设置运行后,你不能选择 exit 0exit 1。你必须测试 ERRORLEVEL,通常是在批处理文件中完成,然后可以使用适当的错误代码退出。 - Ken White
嗯,实际上确实是这样的。&& 运行左侧,如果它为假(命令失败),则运行 && 右侧。操作符优先级分组为 (Left && Middle) || Right。现在我想了想,如果 || 是条件或者只运行到真值,那么我应该使用 & 而不是 || - Caleb Jares
3个回答

12

Start-Process的替代方法是更加简洁的语法调用运算符&

& cmd.exe /c 'ping.exe doesnotexist && exit 0 || exit 1'

退出代码将被包含在内置的变量$LASTEXITCODE中,因此:

Write-Host $LASTEXITCODE

这将包含程序运行的退出代码,因此您不必一定使用CMD.exe运行它,只需执行以下操作:

& ping.exe doesnotexist ; Write-Host $LASTEXITCODE

应用于您的命令行程序:

& cmd.exe /c 'D:\SQL2008R2\SQL2008R2\setup.exe /CONFIGURATIONFILE=sqlconfig.ini && exit 0 || exit 1'

或者只需:

& D:\SQL2008R2\SQL2008R2\setup.exe /CONFIGURATIONFILE=sqlconfig.ini

在这两种情况下,$LASTEXITCODE 应该为0表示成功,否则为非零值(如果外部程序编写正确的话)。


1
是的,我也看到你可以那样做。但我希望我的内容在一个新窗口中打开。所以我需要使用 Start-Process - Caleb Jares

2
这是如何操作:start实际上是Start-Process的别名,因此您需要查看它的文档,这与cmd.exe的start非常不同。因此,您可以这样做:
(Start-Process -FilePath "cmd.exe /c ..." -Wait -Passthru).ExitCode

非常简单!

请记住,这只会将它写入管道。如果您想要将其回显到StdOut,则应使用 Write-Host 命令。 - user189198
这只是一个误报。事实证明,只有在删除 start cmd "/c 部分时才有效。它对我起作用是因为我在我的 PowerShell 会话中尝试了两种方法。命令提示符仍然没有返回任何东西... - Caleb Jares

0

也许有点晚了,但这能帮到你吗?

start /WAIT cmd.exe /C "YOUR-COMMAND-HERE" & if errorlevel 1 echo 'error occurred'

你也可以像这样显式地返回一个错误代码:

start /WAIT cmd.exe /C "YOUR-COMMAND-HERE & exit MY-ERROR-CODE" & if errorlevel 1 echo 'error occurred'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接