我尝试使用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_exec
,system
和exec
获得了不同的一个。{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);
}
答案 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