【问题标题】:Return Code of batch script does not work in php批处理脚本的返回码在php中不起作用
【发布时间】:2023-04-05 22:18:01
【问题描述】:

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

如果我从cmd.exe 运行批处理脚本,echo %errorleve% 将返回正确的退出代码,在本例中为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%

【问题讨论】:

  • 也许执行正确的文件? my_batch.batcommand.bat
  • 对不起,名字打错了。在我的测试中,所有的都在运行
  • 我注意到的行为是,如果 exit /B 12 在括号外,那么 PHP 将获取退出代码 12,否则它是 0
  • 是的,但现有代码在 CMD.exe 中运行良好。为什么不用 PHP 以这种形式工作。
  • 正如 Nico Haase 指出的那样,您得到的是 cmd 进程的退出代码,而不是批处理文件中的退出代码。您可以简单地删除/B

标签: php batch-file exit-code error-code


【解决方案1】:

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
  )
)

【讨论】:

    【解决方案2】:

    您看过http://php.net/function.exec.php 的文档吗?它告诉您调用exec 会生成cmd.exe 的一个实例,这会调用您的批处理脚本。大概,这个中间过程不会把返回码传过去吧?

    解决方案可能是使用proc_open

    【讨论】:

    • proc_open的结果相同
    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多