将错误代码从CMD返回给Powershell

时间:2012-06-12 20:49:54

标签: powershell cmd

我正在研究Mssql安装脚本,我想获得静默mssql安装的结果。在我的PowerShell脚本中,我运行此命令:

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

失败时应返回0,传递时返回1。不幸的是,我没有得到任何输出。有什么想法吗?

3 个答案:

答案 0 :(得分:8)

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 :(得分:2)

您就是这样做的:start实际上是别名Start-Process,因此您必须查看它的文档,这与cmd.exe的文档有很大不同start。所以你可以这样做:

(Start-Process -FilePath "cmd.exe /c ..." -Wait -Passthru).ExitCode

太容易了!

答案 2 :(得分: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'