【问题标题】:Returning an error code from CMD to Powershell从 CMD 返回错误代码到 Powershell
【发布时间】:2014-06-26 11:21:36
【问题描述】:

我正在编写一个 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,这通常在批处理文件中完成,然后可能会以适当的错误代码退出。
  • 嗯,它确实是这样工作的。 && 运行左侧,如果为假(命令失败),则运行 && 的右侧。运算符优先级组(Left && Middle) || Right。现在我想了想,如果|| 是一个条件或并且只运行到一个真值,那么我实际上应该使用& 而不是||

标签: powershell cmd


【解决方案1】:

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 表示成功,否则为非零(如果外部程序编写正确)。

【讨论】:

  • 是的,我看到你也可以这样做。不过,我希望我的在一个新窗口中。所以我需要Start-Process
【解决方案2】:

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

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

这么简单!

【讨论】:

  • 请记住,这只会将其写入管道。如果要将其回显到 StdOut,则可以使用 Write-Host cmdlet。
  • 这是误报。事实证明,这仅在您删除 start cmd "/c 部分时才有效。它对我有用,因为我一直在我的 PowerShell 会话中尝试这两种方法。命令提示符仍然没有返回任何内容..
【解决方案3】:

也许为时已晚,但这有帮助吗?

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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2014-07-03
    • 1970-01-01
    相关资源
    最近更新 更多