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
)
)
我有一个非常简单的批处理文件的奇怪情况,我想从 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
)
)