基本上,我用 C 编写了一个 CGI 脚本,其中包含一个 system() 函数,该函数应该在 EXE 所在的服务器上调用一个批处理文件。我写的示例代码如下:-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
//system("ROBOCOPY \\pdffiles \\\\10.6.202.88\\d$\\pdffiles /mov /ZB /XJ /FFT /MT /R:2 /W:5 /V");
int t = 0;
t= system("PDF_MOVE.bat");
if(t == -1)
{
printf("file copy failure");
}
else
{
printf("file copy successfull");
}
return 0;
}
在我编译这段代码并将生成的 .exe 文件放在 Apache 服务器的一个文件夹中之后。
然后,当我尝试通过在浏览器中输入 exe 的完整路径(即 http://10.6.202.111/path/to/file_copy_test.exe)从 Web 浏览器中访问该 exe 时。这要么尝试下载 .exe 文件,要么给我一个内部服务器错误 (500)。批处理文件包含我在代码中注释的 robocopy 命令。此外,如果我直接尝试通过系统命令运行 robocopy 命令,它也会失败。
- 批处理文件本身运行正常。
- 在命令行上运行 robocopy 命令工作正常。
- 如果我通过双击直接执行 .exe 文件,那么它可以正常工作并正确调用批处理文件。
- 仅当尝试通过浏览器执行 .exe 时,此代码才会失败。
我能做些什么来解决这个问题,是否需要更改任何 Apache 设置?。文件夹的路径需要更改吗?我试过将 ./放在批处理文件名的前面,但它在命令行上失败为“。”无法识别。
Apache 错误日志显示:
[cgi:error] [pid 10604:tid 1512] [client 172.24.2.82:56507] AH01215: 可运行的程序或批处理文件。\r: D:/itrade/app/user/file_copy_test.exe
进行了建议的更改后,我意识到为 Robocopy 命令提供的源路径和目标路径不正确。解决这个问题最终让它发挥作用。
我使用的批处理文件:-
@echo off
(
net use \\10.6.202.88\d$ /user:Username password
ROBOCOPY D:\path\to\pdffiles \\10.6.202.88\d$\pdffiles /ZB /COPYALL /mov /XJ /FFT /MT /R:2 /W:5 /v /tee /log:robocopy_log.txt
EXIT
) >output.txt 2>&1
最佳答案
确保通过将此添加到 VistualHost 文件或 .htaccess 文件来允许执行 cgi(参见:https://www.devside.net/wamp-server/running-exe-and-batch-files-as-cgi-scripts-in-apache-under-windows)
AddHandler cgi-script .bat # add .exe if you wish
Options +ExecCGI +FollowSymlinks
为什么要使用 C 程序/.exe 来执行批处理文件?这个批处理文件也应该可以解决问题(老实说我没有测试过):
@echo off
echo Content-Type: text/html
echo.
CALL PDF_MOVE.bat || goto error
echo file copy successfull
goto :EOF
:error
echo file copy failure
关于c - 如何在用 C 编写的 CGI 应用程序中使用系统命令执行批处理脚本,通过 Web 浏览器(Apache 服务器)执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46927711/