AIRから外部アプリケーションを実行するのは、セキュリティの観点からかなり条件が厳しくなっています。
詳しくは、Adobeのリファレンス
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/desktop/NativeProcess.html
を参照して頂くのが良いと思いますが、
「ネイティブインストーラー(拡張デスクトッププロファイルアプリケーション)を使用してインストールされた AIR アプリケーション」でしか実行できません。
デバッグ(adlを利用)のときは、「-profile extendedDesktop」のオプションを付ける必要があります。
batchfileの所に、実行したいファイルを入れるとAIRからキック出来ます。
ランチャーとか作るのに便利です。
ランチャーとか作るのに便利です。
private function exec(batchfile:String):void {
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
var file:File = new File("C:\\Windows\\System32\\cmd.exe");
nativeProcessStartupInfo.executable = file;
var processArgs:Vector. = new Vector.();
processArgs.push("/c");
processArgs.push(batchfile);
nativeProcessStartupInfo.arguments = processArgs;
process = new NativeProcess();
process.addEventListener(NativeProcessExitEvent.EXIT, onProcExit);
//終了を待って処理を入れたい場合
process.start(nativeProcessStartupInfo);
}
public function onProcExit(event:NativeProcessExitEvent)
{
process.removeEventListener(NativeProcessExitEvent.EXIT, onProcExit);
//終了時の処理をここに入れる
trace(event.exitCode);
//終了コードも取れます。
}
バッチファイル実行しても、コマンドラインウィンドウが出てこないので、
動作確認はログを別途出力するなどの必要があります。
運用者から、あるファイルを監視して1時間変化がなかったらバッチファイルをキックしたいというリクエストがあったので作成しました。その時に調べたものの備忘録です。
機会があれば、そちらのランチャも公開できたらと思います。
ずいぶん前になりますが、可能なら教えてください。
返信削除(1) 上記サンプルコード中の
processArgs.push("/c");
について教えてください。 "/c" がよくわかりません。
(2) batchfileにバッチファイルのパスを設定すると、上記サンプルコードでバッチファイルの処理が実行されるようですが、nativeProcessStartupInfo.executable の方に直接バッチファイルのパスを設定した場合は、実行できないのでしょうか?
よろしくお願いいたします。
ご質問ありがとうございます。
返信削除(1)cmd.exe に渡す引数です。cmd /cでは、その後の文字列をコマンドとして実行します。
この仕組みでバッチファイルを実行しているのですが、バッチファイルや引数に2バイト文字などが入っている場合に、うまく動かない事があるため、念のためいれていますが、これがなくて多くの場合動作するようです。
(2)直接書いても実行できると思います。
サンプルでは汎用性も少々考えて引数にしてあります。
以上、よろしくお願い致します
早速のご回答をありがとうございました。
返信削除"/c" についてよくわかりました。
(2) 今、バッチファイルでなく、ffmpeg.exeを実行させる処理を作成しています。
直接書く場合、上記サンプルのように書く場合、ともに試してみます。
ありがとうございました。
追記です。
返信削除ffmpeg.exeの実行ですが、
・cmd.exeを指定し、コマンドとしてffmpegの処理を実行
・直接 ffmpeg.exeを指定して実行
ともに無事動作する事ができました。
ありがとうございました。