1

Windows で PHP の exec() 関数を使用してコマンドを実行する際に問題が発生しました。exec()に関する PHP のサイトのコメントによると:

Windows では、exec() は "cmd /c your_command" への内部呼び出しを発行します。

私のコマンドは次のようになります。

"path\to\program.exe" -flag1 attribute1 -flag2 attribute2 -flag3 "attribute3 attribute4"

/c フラグを指定せずに、ローカル コマンド プロンプトでこのコマンドを定期的に実行すると、コマンドは正常に実行されます。ただし、/c フラグの導入により、コマンド プロンプトに「指定されたパスが見つかりません」というメッセージが表示されます。

コマンドプロンプトは、二重引用符で囲まれた引数を別のファイルへのパスとして解釈していると思いますが、それは私がこの問題で得た最も遠いものです.

これを乗り越える方法について誰かアイデアはありますか?ありがとう!

4

4 に答える 4

2

自力で答えを導き出した...

cmd.exe の /? を熟読した後 それを解読しようとして、1 つの重要なセクションに気付きました。

  1. 次の条件がすべて満たされている場合、コマンド ラインの引用符は保持されます。

    • /S スイッチなし (引用符を削除)
    • 正確に 2 つの引用符
    • 2 つの引用符の間に特殊文字は使用できません。ここで、special は次のいずれかです。
    • 2 つの引用符の間に 1 つ以上の空白文字があります
    • 2 つの引用符で囲まれた文字列は、実行可能ファイルの名前です。
  2. それ以外の場合、古い動作は、最初の文字が引用符であるかどうかを確認し、そうである場合は、先頭の文字を削除し、コマンド ラインの最後の引用符を削除して、最後の引用符の後のテキストを保持します。この動作を無効にするには、コマンド ラインの最初と最後に二重引用符 "" を使用します。

いつでも複数の引用符のペアがある場合、引用符は 2 番目の引用符のペアから取り除かれるように見えます。

関連する質問: cmd.exe を使用しているときに引用符文字を処理するにはどうすればよいですか? PHP では、呼び出しに /S フラグを付けて exec() コマンドを変更することはできません (これは間違いなく多くのことです)。より簡単に)。

chdir() を使用してディレクトリを .exe があるフォルダーに直接変更し、chdir() で元の作業ディレクトリに戻すことで、この問題を回避することができました。二重引用符を使用した引数のセットが 1 つしかない幸運な場合を考えると、これは非常にハックなソリューションです。誰かが二重引用符を使用して複数の引数を持っている場合、それを解決する方法がわかりません...

于 2012-07-20T17:49:29.103 に答える
0

推測です(私はWindows上のPHPに慣れていません):引用符をエスケープし"""?

"path\to\program.exe" -flag1 attribute1 -flag2 attribute2 -flag3 ""attribute3 attribute4""

解決策が何であれ、このコマンドに引数として渡される何らかの形式のユーザー入力がある場合は、escapeshellargおよび/またはescapeshellcmdを使用するようにしてください。

于 2012-07-19T21:26:25.783 に答える