4

cmd-lineを介してwin2003サーバーPHP526で実行しています。

コマンドライン文字列があります:

$cmd = '  "d:\Prog Files\foo.exe" -p "d:\data path\datadir"  ';  

PHPコードでこれを行おうとしています

$out = `$cmd`;       # note use of backticks AKA shell_exec

-p argを「d:\ data」として解釈するため、foo.exeは失敗します。

ただし、$cdmWindowsシェルコマンドラインにコピーされた同じ文字列は正常に実行されます。

PHPでスペースを適切に処理するにはどうすればよいshell_execですか?

4

4 に答える 4

6

escapeshellarg() を使用して引数をエスケープします。プラットフォームに適した引用符とエスケープされたスペースの組み合わせでエスケープする必要があります (Windows を使用していると思います)。

于 2008-12-18T17:42:22.227 に答える
1

引用符内の引用符をエスケープする必要がある Unix とは異なり、Windows はこの方法では機能しないようです。引用符をどのように追跡するかは私にはわかりませんが、すべての論理が反対であるにもかかわらず、これは実際には機能しているようです:

$cmd = '" "C:\Path\To\Command" "Arg1" "Arg2" "';
$fp = popen($cmd, 'r');
$output='';
while ($l = fgets($fp, 1024))
$output.=$l;

私は、command.exe がコマンド文字列の合計を取得し、(それ以外の場合は冗長な) 外側の引用符を削除していると推測しています。これらの外側の引用符がないと、DOS は奇妙なことをします。このソリューションは user187383 による投稿に似ていますが、実際に何が起こっているかを難読化するだけの "cmd /c" を廃止し、軽度のパフォーマンス カットを行います。これは、cmd /c がそもそもシェル呼び出しによって暗黙的に指定されているためです。

于 2011-02-22T23:40:16.230 に答える
0

これは興味深い問題です。どうやら、PHP ではプログラムまたは引数を二重引用符で囲むことができますが、両方を囲むことはできません。これはバグとして報告する価値があるかもしれません。

回避策は、引用符の代わりに DOS 8.3 名を使用することです。たとえば、「C:\Program Files\」は通常「C:\Progra~1」になります。

于 2009-10-07T02:38:18.167 に答える
0

この問題もありました-cmd.exeを介して起動をルーティングするというアイデアを思いつきました。ここでのコツは、二重引用符で迷子にならないようにすることです。通常、実行したいものは何でも入れたい:

exec('cmd /c " '.$path.' "';

$path は、実行可能ファイルへの既に二重引用符で囲まれたパスです。例:

$path = '"C:\Program Files\ToDoList Simple\ToDoList.exe" "C:\SomePath\todo.tdl" -nt test -cm test2';
于 2009-10-09T19:01:08.283 に答える