【WSH】RunとExecの違い

まとめ

Run Exec
表示 IntWindowStyle引数で指定可能
非表示/表示/アクティブ/最小化/最大化
非表示(cscript)/表示(wscript)
入出力 不可※ StdIn/StdOut/StdErrが取得可能
親終了 親通常終了:子実行継続
親強制終了:子実行継続
親通常終了:子実行継続※
親強制終了:子強制終了
子強制終了 不可※ Terminateで強制終了が可能
戻り値 同期実行時の戻り値 ExitCodeで取得可能
プロセスID 不可※ ProcessIDで取得可能

表示

  • Run
    • 引数のIntWindowStyleで指定可能
    • 下記の表参考
  • Exec
    • 実行方法で強制選択
    • 非表示(cscript)/表示(wscript)

IntWindowStyle

IntWindowStyle 内容
0 ウィンドウを非表示にし、別のウィンドウをアクティブにします。
1 ウィンドウをアクティブにして表示します。ウィンドウが最小化または最大化されている場合は、元のサイズと位置に戻ります。アプリケーションでウィンドウを最初に表示するときには、このフラグを指定してください。
2 ウィンドウをアクティブにし、最小化ウィンドウとして表示します。
3 ウィンドウをアクティブにし、最大化ウィンドウとして表示します。
4 ウィンドウを最新のサイズと位置で表示します。アクティブなウィンドウは切り替わりません。
5 ウィンドウをアクティブにし、現在のサイズと位置で表示します。
6 指定したウィンドウを最小化し、Z オーダー上で次に上位となるウィンドウをアクティブにします。
7 ウィンドウを最小化ウィンドウとして表示します。アクティブなウィンドウは切り替わりません。
8 ウィンドウを現在の状態で表示します。アクティブなウィンドウは切り替わりません。
9 ウィンドウをアクティブにして表示します。ウィンドウが最小化または最大化されている場合は、元のサイズと位置に戻ります。アプリケーションで最小化ウィンドウを復元するときには、このフラグを指定してください。
10 アプリケーションを起動したプログラムの状態に基づいて、表示状態を設定します。

入出力

  • Run
    • 不可(ただし、ファイルから入出力が可能)
    • 入力:子標準入力にファイルを入力する
    • 出力:子標準出力をファイル出力後、親からファイルを読込んで結果を取得する
  • Exec
    • StdIn/StdOut/StdErrが取得可能

親終了

  • Run
    • 親通常終了:子実行継続
    • 親強制終了:子実行継続
  • Exec
    • 親通常終了:子実行継続(親終了後、入出力でエラー)
    • 親強制終了:子強制終了

子強制終了

  • Run
    • 不可
    • プロセスIDを取得できれば可能
  • Exec
    • Terminate関数で強制終了
    • プロセスIDを使用して強制終了
      • WMI等を使用する

戻り値

  • Run
    • 同期実行時の戻り値
    • 非同期実行時は不可
  • Exec
    • ExitCode変数から取得

プロセスID

  • Run
    • 不可
    • ただし、特殊な引数等で実行して、WMIでプロセスを特定すれば可能
  • Exec
    • ProcessID変数から取得

Runサンプル

if (WScript.Arguments.Named.Exists('abc')) {
  // abcオプションあり
  WScript.Echo(WScript.StdIn.ReadLine());
  for (var i=0; i<3; i++) {
    WScript.StdOut.Write(i);
    WScript.StdErr.Write('Error Test.\n');
  }
  WScript.StdOut.Write('\n');
  WScript.Quit(3);
} else {
  // abcオプションなし
  var fs = new ActiveXObject('Scripting.FileSystemObject');
  var f1 = fs.OpenTextFile(".\\run.in.txt", 2, true)
  f1.WriteLine('Hello Run World.');
  f1.Close();
  f1 = null;

  var sh = new ActiveXObject('WScript.Shell');
  var ret = sh.Run('cmd /C 1> run.out.txt 2> run.err.txt cscript "'+WScript.ScriptFullName+'" /abc+ < run.in.txt', 1, true);

  var f2 = fs.OpenTextFile(".\\run.out.txt", 1)
  var out = f2.ReadAll();
  f2.Close();
  f2 = null;

  var f3 = fs.OpenTextFile(".\\run.err.txt", 1)
  var err = f3.ReadAll();
  f3.Close();
  f3 = null;

  WScript.Echo(''
    +      'stdout: '+'\n'+out
    + '\n'+'stderr: '+'\n'+err
    + '\n'+'  exit: '+ret
  );
}

/* 実行結果例
> cscript run.js
stdout:
Hello Run World.
012

stderr:
Error Test.
Error Test.
Error Test.

  exit: 3

*/

Execサンプル

if (WScript.Arguments.Named.Exists('abc')) {
  // abcオプションあり
  WScript.Echo(WScript.StdIn.ReadLine());
  for (var i=0; i<3; i++) {
    WScript.StdOut.Write(i);
    WScript.StdErr.Write('Error Test.\n');
  }
  WScript.StdOut.Write('\n');
  WScript.Quit(3);
} else {
  // abcオプションなし
  var sh = new ActiveXObject('WScript.Shell');
  var obj = sh.Exec('cscript "'+WScript.ScriptFullName+'" /abc+');

  // 1行入力
  obj.StdIn.WriteLine('Hello Exec World');

  // 終了待機 + 標準出力の全読み込み
  var out = obj.StdOut.ReadAll();
  var err = obj.StdErr.ReadAll();
  var id = obj.ProcessID;
  var exit = obj.ExitCode;
  obj = null;

  WScript.Echo(''
    +      'stdout: '+'\n'+out
    + '\n'+'stderr: '+'\n'+err
    + '\n'+'    id: '+id
    + '\n'+'  exit: '+exit
  );
}

/* 実行結果例
> cscript exec.js
stdout:
Hello Exec World
012

stderr:
Error Test.
Error Test.
Error Test.

    id: 17224
  exit: 3

*/

参考

 コメントを書く