質問: これを実行すると、「CreateProcess error=193, %1 は有効な Win32 アプリケーションではありません。」というエラーが出ます。実行が成功すると「Hello world!」と出力されるはずなのですが、全然うまくいきません。 このエラーの解決方法を教えてください。
回答: 「ファイルを実行する」ことの意味について少しコメントします。 例えば「a.txtを実行する」(より正確にはa.txtというドキュメントファイルを編集する)の例としては 1. Explore上でファイルをダブルクリックする 2. コマンドプロンプトで(a.txtがある場所で)"a.txt"+ENTER 3. コマンドプロンプトで(a.txtがある場所で)"notepad a.txt"+ENTER といった方法があります。これらは最終的にオペレーティングシステムへ「新たにプロセスを生成し、そこでnotepad.exeを実行させ、起動時に処理対象のファイルa.txtを渡す」といった指示をすることで実現されています。オペレーティングシステムによって処理の詳細は違いますが概ね似たようなものと考えてよいでしょう。 さて、javaの`Runtime#exec`の動作を調べてみると、前述の3に近い指定をしないと動いてくれません。1~2はExploreやコマンドプロンプトが「a.txtを実行する」ということが「notepad.exeに対してa.txtを編集させることだ」と解釈してくれているのに対してexecはそういうことをしてくれないことがわかります。 これをphpの実行にあてはめれば結局以下のようにしなければならないわけです。 `exec("PHP xxx.php")` // PHPの実行がPHP.exeで行われるかどうかはご自分で調べてください。(自分は知らないのです) また実行ファイル名しか書かない場合はPATH環境変数などによる実行可能ファイルの場所が優先順に従って探されて実際に起動すべきプログラム(EXEファイル)が見つからなければならない(俗にいうパスを通す)ことを知ってなければいけません。それに依存しないようにするためにはプログラムの正確な場所をフルパスで指定しなければならないということも理解できるはずです。 やりかたを何かで読んだり教わったとき「教わった通りにやる」ことから少し進んで「仕組みはどうなっている?」「なぜそうなる?」にこだわって学習していくと問題解決の力が付きやすくなると思います。仕組みなどの背景の知識はより広く応用できる(javaのexecの使い方がわかる以上のことに役立つ)知識だからです。