php为什么我不能运行批处理文件?

时间:2016-08-02 15:03:29

标签: php batch-file

我尝试使用PHP运行批处理文件:

$script = "\\\MAFINFWWWPV02\D$\WebContent\\engsys.corp.ftr.com\BatchFiles\CopyFiles.bat";
exec($script,$ReturnArray,$ReturnValue);
//shell_exec($script);
//system('cmd /c $script');
//system($script,$ReturnValue);

这些都不起作用!我试过了

var_dump($ReturnValue); echo "<br>";
var_dump($ReturnArray); echo "<br>";

尝试看看发生了什么,但我得到的似乎是正常输出:

  

int(1)

     

array(0){}

但我尝试使用我的bat文件复制的文件,在手动运行时工作正常,不会被复制!

修改其他问题

\是否需要在文件地址中进行转义?

编辑2

这是我从运行icacls得到的结果:

  

CopyFiles.bat NT AUTHORITY \ IUSR:(I)(RX)

         NT AUTHORITY\SYSTEM:(I)(F)

         NT AUTHORITY\NETWORK:(I)(RX)

         CORP\ibb601:(I)(F)

         CORP\taw330:(I)(F)

         CORP\mmm976:(I)(F)

         BUILTIN\Administrators:(I)(F)

         BUILTIN\Users:(I)(RX,W)

我完全掌控,其他人至少都有阅读/执行。

编辑3

我缩小了范围。并不是命令不起作用,而是对文件拒绝了权限。我不明白,因为每个人都对整个文件夹进行了写入和读取/执行访问。

编辑4

我正在运行上面的命令,试图让它工作。我正在使用一个函数(var_export(my_exec("shell_exec($script)"));)来打印错误到我的屏幕。我不断得到这样的东西:

  

&#39; \&#39;了shell_exec \&#39;不被识别为内部或外部命令,可操作程序或批处理文件。

我为每个shell_execsystemexec获得了不同的一个。{p>它只是说不能识别命令。这是在Windows Server 2012 R2 Standard 64位上执行的。我的命令是否有问题?

我用来打印错误的功能(我在另一篇文章中找到了它):

function my_exec($cmd, $input='')
    {
        $proc=proc_open($cmd, array(0=>array('pipe', 'r'), 1=>array('pipe', 'w'), 2=>array('pipe', 'w')), $pipes); 
        fwrite($pipes[0], $input);fclose($pipes[0]); 
        $stdout=stream_get_contents($pipes[1]);fclose($pipes[1]); 
        $stderr=stream_get_contents($pipes[2]);fclose($pipes[2]); 
        $rtn=proc_close($proc); 
        return array('stdout'=>$stdout,'stderr'=>$stderr,'return'=>$rtn); 
    }

3 个答案:

答案 0 :(得分:0)

在单引号内时,您无需转义\

如果要运行脚本,请确保该脚本存在且可执行:

$script = '\\MAFINFWWWPV02\engsys.corp.ftr.com\CopyFiles.bat';

if (!file_exists($script) || !is_executable($script)) {
    // Im' sorry dave
}

// carry on...

如果脚本是通过网络服务器运行的,请确保运行该服务的用户具有执行权限,而不是您自己的用户! is_executable仅检查文件是否为可执行文件,而不是运行脚本的用户是否具有可执行权限

由于您的返回代码为1,因此您可能会遇到一些权限问题。成功执行会返回代码0

另请参阅文档中的以下说明:

  

注意:启用安全模式后,您只能执行safe_mode_exec_dir中的文件。出于实际原因,目前不允许在可执行文件的路径中包含..组件。

要使用操作系统无关的方法来运行exernal进程,请查看Symfony Process component

答案 1 :(得分:0)

我终于开始工作了。这就是我最终得到的结果:

$script = chr(92) . chr(92) . 'MAFINFWWWPV02\D$\WebContent\engsys.corp.ftr.com\BatchFiles\CopyFiles.bat';
if (!file_exists($script))
{
    var_dump($script); echo " Script<br>";
    echo "Script doesn't exist!<br>";
    var_dump(!file_exists($script));
}
else
{
    system('cmd /c ' . $script); echo " <br>";
}

有时候我仍然收到Script doesn't exist!消息,但通常是我连接到#1服务器而不是#2服务器。 .nat看起来像这样:

echo off
SET source2="\\MAFINFWWWPV02\engsys.corp.ftr.com"

START /wait NET USE L: "\\MAFINFWWWPV01\engsys.corp.ftr.com" Password /user:UserName

xcopy %source2% L: /E /Y /Q

NET USE L: /DELETE

答案 2 :(得分:-1)

几个小时后。你应该试试

c:\\a\\b\\c
而不是     C:\ A \ B \ C