これは私を夢中にさせています。PHP Web アプリの Windows ボックスでコマンド ライン ステートメントを実行しようとしています。Windows XP、IIS5.1 で動作しています。Web アプリは正常に動作していますが、@exec() を特定の contactenated 変数で動作させることができません。私のコマンド構成は次のようになります。
$cmd = ($config->svn." cat ".$this->repConfig->svnParams().quote($path).' -r '.$rev.' > '.quote($filename));
このコマンドは、次の文字列を生成する場合、上記のようには機能しません。
svn --non-interactive --config-dir /tmp cat "file:///c:/temp/test/acccount/dbo_sproctest.sql" -r 1 > "C:\Inetpub\sites\websvn\temp\wsv5B45.tmp"
これを自分のコマンド ラインにコピーして貼り付けると、問題なく動作します。
変数を追加する代わりに、まったく同じパスをハードコーディングすると、機能します! ファイル名を引用符で囲んだり付けたりせずに試しました。コマンド全体を引用符で囲んだり付けたりせずに試しました。他のディレクトリを試しました。出力パラメーターを exec() に渡そうとしましたが、空に戻りました (Array () )。コマンドのエラー ストリームの出力をファイルにリダイレクトしようとしましたが、そのエラー出力ファイルは作成されません。
私が想像できる唯一のことは、 exec() が静かに失敗していることです。ここで一体何が間違っているのですか?同じディレクトリ構造とファイル名を使用してファイルパスをハードコードすると、正常に機能します。私がしなければ、そうではありません。
ファイルパスのスラッシュ () が適切にエスケープされていない可能性がありますが、単一引用符を使用して手動で行うと、エスケープシーケンスとは見なされませんか??
アップデート:
@ を exec から外しましたが、まだエラーは表示されません。
私はSVNへのフルパスを与えましたが、まだうまくいきません。catのファイル宛先を手動で指定する限り、コマンドは以前はフルパスではないSVNで正常に機能していたことに注意してください。
更新 2: RE: キース
両方を試して exec を呼び出しています:
exec($cmd);
また
exec($cmd, $out);
私のphp.iniにはすでにsafe_mode = 0がありました。
error_reporting(E_ALL); を追加しました。そして何も新しいものを見ませんでした
exec 呼び出しをエコー (または print_r) しても、実際には何も表示されません。
出力変数が含まれているときに exec 呼び出しをエコー (または print_r) すると、空の arr が返されます
アップデート 3
escapeshellcmd と escapeshellarg の両方を試してみましたが、役に立ちませんでした (ただし、良い考えです)。
呼び出しによってファイルが作成されていることを追加する必要があります
tempnam("temp", "wbsn");
文字列を tempname で生成するのではなく、手動で指定すると問題なく動作するという事実は、問題の原因を示唆しているようですが、方法がわかりません。手動文字列と生成された文字列を比較したところ、一致していました。