Return 批处理脚本代码在 php 中不起作用

Return Code of batch script does not work in php

我有一个非常简单的批处理文件的奇怪情况,我想从 PHP 运行,并获取它的退出代码。

如果我 运行 来自 cmd.exe 的批处理脚本,echo %errorleve% 将 return 正确的退出代码,在本例中为 12。 来自 PHP 脚本,退出代码为 0.

my_batch.bat 文件

@ECHO OFF

if "1"=="1" (
  if "1"=="1" (
    echo quitting
    exit /B 12
  )

  echo anything
)

my_test.php

<?php
exec('my_batch.bat',$result,$exitcode);
echo $result[0];
echo '<br />';
echo $exitcode;

来自 cmd.exe 的输出

D:\tools\xampp\htdocs\test>my_batch.bat
quitting

D:\tools\xampp\htdocs\test>echo %errorlevel%
12

D:\tools\xampp\htdocs\test>

输出哦php:

quitting
0

感谢您的支持

编辑 1

很奇怪,如果我用这个版本更改代码,一切正常

my_batch.bat 文件

@ECHO OFF

if "1"=="1" (
  if "1"=="1" (
    echo quitting
    SET MYERROR=12
    GOTO:END 
  )

  echo anything
)

:END
echo finished ... ERRORLEVEL "%MYERROR%"
exit /b %MYERROR%

您看过 http://php.net/function.exec.php 上的文档了吗?它告诉您 exec 的调用会生成 cmd.exe 的实例,这会调用您的批处理脚本。大概,这个中间过程不会通过return代码?

一个解决方案可能是使用 proc_open

exit /b 所在的任何级别的括号中存在附加命令时,批处理文件中会出现一个奇怪的异常现象。

根据您的示例,exit /b 12 是括号级别 2 中的最后一个命令,而不是括号级别 1 中的最后一个命令。

为了使批处理文件完全退出并以 exit 代码响应,您可以将 if 语句转换为 if/else 以像这样将命令彼此隔离.

if "1"=="1" (
  if "1"=="1" (
    echo quitting
    exit /b 12
  ) else (
    echo anything
  )
)