2

cscriptと を使用して Windows シェル スクリプトを作成しようとしていましたJavascript。アイデアは、コマンド ラインに何度も入力するのにうんざりしていた、非常に長い Python コマンドを使用することでした。私がやりたかったのは、Python コマンド全体を Windows スクリプトに記述し、その Windows スクリプトを呼び出すだけのはるかに短いスクリプトを作成することでした。それが理にかなっている場合、「コマンド内のコマンド」を呼び出す方法がわかりません。

これはおそらく簡単なことですが、私はこれが初めてなので、ご容赦ください。

アイデア:

元のコマンドの例:python do <something really complicated with a long filepath>

Windows スクリプト:cscript easycommand

 <package id = "easycommand">
      <job id = "main" >
          <script type="text/javascript">
               // WHAT GOES HERE TO CALL python do <something really complicated>
               WScript.Echo("Success!");
          </script>
      </job>
 </package>

ご助力いただきありがとうございます!

4

2 に答える 2

4

これが私が使用するものです

function logMessage(msg) {
    if (typeof wantLogging != "undefined" && wantLogging) {
        WScript.Echo(msg);
    }
}

// http://msdn.microsoft.com/en-us/library/d5fk67ky(VS.85).aspx
var windowStyle = {
    hidden    : 0,
    minimized : 1,
    maximized : 2
};

// http://msdn.microsoft.com/en-us/library/a72y2t1c(v=VS.85).aspx
var specialFolders = {
    windowsFolder   : 0,
    systemFolder    : 1,
    temporaryFolder : 2
};

function runShellCmd(command, deleteOutput) {
    deleteOutput = deleteOutput || false;
    logMessage("RunAppCmd("+command+") ENTER");
    var shell = new ActiveXObject("WScript.Shell"),
        fso = new ActiveXObject("Scripting.FileSystemObject"),
        tmpdir = fso.GetSpecialFolder(specialFolders.temporaryFolder),
        tmpFileName = fso.BuildPath(tmpdir, fso.GetTempName()),
        rc;

    logMessage("shell.Run("+command+")");

    // use cmd.exe to redirect the output
    rc = shell.Run("%comspec% /c " + command + "> " + tmpFileName,
                       windowStyle.Hidden, true);
    logMessage("shell.Run rc = "  + rc);

    if (deleteOutput) {
        fso.DeleteFile(tmpFileName);
    }
    return {
        rc : rc,
        outputfile : (deleteOutput) ? null : tmpFileName
    };
}

上記を使用して、IIS で定義されたサイトを Appcmd.exe で一覧表示する方法の例を次に示します。

var
fso = new ActiveXObject("Scripting.FileSystemObject"),
windir = fso.GetSpecialFolder(specialFolders.WindowsFolder),
r = runShellCmd("%windir%\\system32\\inetsrv\\appcmd.exe list sites");
if (r.rc !== 0) {
    // 0x80004005 == E_FAIL
    throw {error: "ApplicationException",
           message: "shell.run returned nonzero rc ("+r.rc+")",
           code: 0x80004005};
}

// results are in r.outputfile

var
textStream = fso.OpenTextFile(r.outputfile, OpenMode.ForReading),
sites = [], item, 
re = new RegExp('^SITE "([^"]+)" \\((.+)\\) *$'),
parseOneLine = function(oneLine) {
    // each line is like this:  APP "kjsksj" (dkjsdkjd)
    var tokens = re.exec(oneLine), parts;

    if (tokens === null) {
        return null;
    }
    // return the object describing the website
    return {
        name : tokens[1]
    };
};

// Read from the file and parse the results.
while (!textStream.AtEndOfStream) {
    item = parseOneLine(textStream.ReadLine()); // you create this...
    logMessage("  site: " + item.name);
    sites.push(item);
}
textStream.Close();
fso.DeleteFile(r.outputfile);
于 2012-07-02T21:35:32.477 に答える
1

まあ、基本的に:

  1. スクリプトを実行できるように、シェルへのハンドルを取得します
  2. 実行するコマンド (パラメータとすべて) を文字列として作成します。
  3. シェルハンドルでメソッドを呼び出し、Run必要なウィンドウモードと、生成されたプロセスが終了するまで (おそらく) 待機するかどうかを決定します。
  4. Run例外をスローするためのエラー処理

この時点で、複数回実行する必要がある場合は、多くのユーティリティ関数を作成する価値があります。

// run a command, call: run('C:\Python27\python.exe', 'path/to/script.py', 'arg1', 'arg2') etc.
function run() {
  try {
    var cmd = "\"" + arguments[0] + "\"";
    var arg;
    for(var i=1; i< arguments.length; ++i) {
      arg = "" + arguments[i];
      if(arg.length > 0) {
    cmd += arg.charAt(0) == "/" ? (" " + arg) : (" \"" + arg + "\"");
      }
    }
    return getShell().Run(cmd, 1, true); // show window, wait until done
  }
  catch(oops) {
    WScript.Echo("Error: unable to execute shell command:\n"+cmd+ 
             "\nInside directory:\n" + pwd()+
         "\nReason:\n"+err_message(oops)+
         "\nThis script will exit.");
    exit(121);
  }
}

// utility which makes an attempt at retrieving error messages from JScript exceptions
function err_message(err_object) {
  if(typeof(err_object.message) != 'undefined') {
    return err_object.message;
  }
  if(typeof(err_object.description) != 'undefined') {
    return err_object.description;
  }
  return err_object.name;
}

// don't create new Shell objects each time you call run()
function getShell() {
  var sh = WScript.CreateObject("WScript.Shell");
  getShell = function() {
    return sh;
  };
  return getShell();
}

あなたのユースケースではこれで十分かもしれませんが、作業ディレクトリなどを変更するルーチンでこれを拡張したい場合があります。

于 2012-06-28T00:41:21.033 に答える