2013年3月13日水曜日

AIRでバッチファイルを実行する方法

AS3,AIRからバッチファイルを実行する方法。

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時間変化がなかったらバッチファイルをキックしたいというリクエストがあったので作成しました。その時に調べたものの備忘録です。

機会があれば、そちらのランチャも公開できたらと思います。


4 件のコメント:

  1. ずいぶん前になりますが、可能なら教えてください。

    (1) 上記サンプルコード中の
     processArgs.push("/c");
     について教えてください。 "/c" がよくわかりません。

    (2) batchfileにバッチファイルのパスを設定すると、上記サンプルコードでバッチファイルの処理が実行されるようですが、nativeProcessStartupInfo.executable の方に直接バッチファイルのパスを設定した場合は、実行できないのでしょうか?

    よろしくお願いいたします。

    返信削除
  2. ご質問ありがとうございます。

    (1)cmd.exe に渡す引数です。cmd /cでは、その後の文字列をコマンドとして実行します。
    この仕組みでバッチファイルを実行しているのですが、バッチファイルや引数に2バイト文字などが入っている場合に、うまく動かない事があるため、念のためいれていますが、これがなくて多くの場合動作するようです。

    (2)直接書いても実行できると思います。
    サンプルでは汎用性も少々考えて引数にしてあります。

    以上、よろしくお願い致します

    返信削除
  3. 早速のご回答をありがとうございました。
    "/c" についてよくわかりました。
    (2) 今、バッチファイルでなく、ffmpeg.exeを実行させる処理を作成しています。
    直接書く場合、上記サンプルのように書く場合、ともに試してみます。

    ありがとうございました。

    返信削除
  4. 追記です。

    ffmpeg.exeの実行ですが、
    ・cmd.exeを指定し、コマンドとしてffmpegの処理を実行
    ・直接 ffmpeg.exeを指定して実行
    ともに無事動作する事ができました。

    ありがとうございました。

    返信削除