2016-08-02 16 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) 

Iフルコントロールを持ち、ほかの誰もが少なくとも読み取り/実行できます。

EDIT 3

私はそれを絞られています。コマンドが機能していないということではなく、ファイルに対するアクセス許可が拒否されているということではありません。私は誰もがフォルダ全体への書き込みと読み取り/実行のアクセス権を持っているので、私は理解しません。

EDIT 4

私はそれが動作するように取得しようと上からのコマンドを実行しています。私は何のエラーが私の画面にあるかを印刷する機能(var_export(my_exec("shell_exec($script)"));)を使用しています。私はこのようなものを得続けます:

'\' shell_exec \ 'は内部または外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されません。

私は別の各shell_execに1つ、system、およびexecを取得します。コマンドが認識されないと言っているだけです。これは、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サービスを実行するユーザーは、そのサーバー、場所やバットファイルへのアクセスおよび/またはdoesnのための権限を持っていませんコピーするファイルまたは宛先にアクセスする権限を持っていません。 – 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... 

スクリプトはWebサーバを介して実行されている場合は、サービスを実行しているユーザーが実行権限を持っていることを確認し、ご自身ではありませんユーザー! is_executableは、ファイルを実行可能にするかどうかのみをチェックし、スクリプトを実行しているユーザーに実行可能なアクセス権がないかどうかを確認します。

戻りコードは1です。正常に実行される。また、ドキュメントから、次の注意事項を考慮して、コードに0

を返しました:

注意:セーフモードが有効になっている場合、あなただけのsafe_mode_exec_dir内のファイルを実行することができます。現実的な理由から、現在、実行可能ファイルへのパスにはコンポーネントが含まれていません。

exernalプロセスを実行するOSに依存しない方法を持って、私は最終的にそれが動作するようになったSymfony Process component

+0

すべてのユーザーに読み取り/実行権限があります。私は一度に1つの小切手を調べて、どちらが問題かを調べました。それは問題である '!is_executable($ script)'であることが判明しました。しかし、誰もが問題を実行許可を持っている場合は? – Mike

-1

あなたの代わりに Cの

c:\\a\\b\\c 

を試してみてください:\ bは\ Cの

関連する問題