2016-08-02 90 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