2016-08-02 55 views
0

我试图使用PHP来运行一个批处理文件: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)

阵列(0) {}

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

编辑额外的问题

执行\需要在文件地址进行转义?

EDIT 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

我已经把范围缩小。这不是说这些命令不起作用,而是许可被拒绝。我不明白,因为每个人都有写入和读取/执行整个文件夹的权限。

EDIT 4

我从上面的努力得到它的工作运行的命令。我正在使用功能(var_export(my_exec("shell_exec($script)"));)将错误信息打印到我的屏幕上。我总是这样的:

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

我得到一个不同的每个shell_execsystemexec。它只是一直说这个命令不被识别。这是在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); 
    } 
+0

运行Web服务可能没有权限访问该服务器,位置或BAT文件和/或没有按用户没有权限访问文件或复制目的地。 – AbraCadaver

+0

@AbraCadaver我已确保用户确实可以读取/写入这两个文件位置以及.bat文件的位置。 – Mike

+0

@AbraCadaver有没有一种方法可以确切地查看哪个用户正在使用?或者强迫它使用某个用户? – Mike

回答

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 
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过程的OS不可知的方法,看看在Symfony Process component

+0

所有用户都有读取/执行权限。我一次只尝试一次检查,看看是哪个问题。事实证明,这是'!is_executable($ script)'这就是问题所在。但是如果每个人都有执行权限,那么问题是什么? – Mike

-1

几个小时后。你应该尝试

c:\\a\\b\\c 

,而不是 C:\ A \ B \ C

相关问题