fc2ブログ

WSHオンラインリファレンス

Microsoft Windows Script Technologies

WSHのリファレンスマニュアル。MSDN。


Windows Script

概要は書いてあるけどリファレンスまでたどり着けなくなってる

MSXML

MSXMLのリファレンス

日ごと履歴管理用WSHスクリプト

WordやPowerPointやExcelのドキュメントを作成している時に原始的な履歴 管理のためにファイル名に日付を入れていた。毎日編集前にコピーしてリネー ムしていたのだが、いいかげんその作業にうんざりしてきた。なのでドラッ グアンドドロップで自動的にコピー、リネームで日付を付けるスクリプトを 書いた。
使ってみると以外に便利。もっと早く作っておけばよかった。

使い方は、xxx.jsとしたWSHスクリプトにコピー、リネームしたいファイル をドラッグ&ドロップするだけ。
xxxx.docがxxx-20061018.docにコピーされる。

///////////////////////////////////////////////////////////////////////////////
//

main();

///////////////////////////////////////////////////////////////////////////////
//
function main() {
  var shell = WScript.CreateObject("WScript.Shell");
  var fs = WScript.CreateObject("Scripting.FileSystemObject");
  var args = WScript.Arguments;

  try {

    var name = nameDaily(args(0));

    while (fs.FileExists(name)) {
      name = nameDaily(name);
    } 
  
    fs.CopyFile(args(0), name, false);

  } catch (e) {
    var description = "no info";
    if (e.description.length != 0) {
      description = e.description;
    }
    var message = "ERROR: Cannot copy file (" + description + ")\n";
    message += relevant;
    WScript.Echo(message);
    return;
  }
  shell.Popup("コピー完了しました", 0, "Complete...", 0);
}

///////////////////////////////////////////////////////////////////////////////
//
function nameDaily(s) {
  var re = /^(.+?)-?(\d{4}\d{2}\d{2})?-?(\d?)(\..+)?$/;
  var r = re.exec(s);
  if (r == null) {
    throw new Error(0, "ファイル名が不正なフォーマットです");
  }

  var prefix = RegExp.$1;
  var date   = RegExp.$2;
  var rev    = RegExp.$3;
  var suffix = RegExp.$4;
  var revision = "";

  if (date == getDateSuffix()) {
    var v = 1;
    if (0 < rev.length) {
      v = parseInt(rev);
      v++;
    }
    revision = "-" + v;
  }

  return nameUpdated(prefix, revision, suffix);
}

function nameUpdated(prefix, revision, suffix) {
  var name = "";
  name += prefix;
  name += "-";
  name += getDateSuffix();
  name += revision;
  name += suffix;
  return name;
}

function getDateSuffix() {
  var d = new Date();
  var s = "";
  s += d.getYear();
  s += format2Digits(d.getMonth() + 1);
  s += format2Digits(d.getDate());
  return s;
}

function format2Digits(v) {
  if (v < 2) {
    return "0" + v;
  }
  return v;
}

Excelファイル複製スクリプト

エクセルで内容はほとんど同じだけれど、ちょっと違うファイルが複数あった 場合に、テンプレートを元にそれらのファイルを生成しちゃおうと思ってスク リプトを作りました。

わざわざエクセルで1つ1つのファイルを開かなくてもスクリプトを修正すれば スクリトをダブルクリック一発で全てのファイルに変更が反映できたりするの で便利かと思うのですが、どうでしょう。VBAマクロを使って警告が表示され るのも鬱陶しいですし結構良いのかなとも思います。

////////////////////////////////////////////////
//

// 複製元テンプレートファイル
var _template = "000-00-00-0000.xls";

// 複製先ファイル名
var _dirs = new Array(
  "000-00-00-000A.xls",
  "000-00-00-000B.xls",
  "000-00-00-000C.xls"
);

// 複製時に変換する文字列のパターン
var _pattern = "AA";

// 複製時に変換する文字列の置換先の文字列
var _replace = new Array(
  "A",
  "B",
  "D",
);

////////////////////////////////////////////////
//

main();

////////////////////////////////////////////////
//

function main() {
  copy(_template, _dirs);
}

function copy(src, dirs) {
  var fs = WScript.CreateObject("Scripting.FileSystemObject");

  try {
    var message = "";
    for (dst in dirs) {
      fs.CopyFile(src, dirs[dst]);
      transpose(dirs[dst], _pattern, _replace[dst]);
      message += src + " => " + dirs[dst] + "\n";
    }
    message = "複製完了しました...\n" + message;
    WScript.Echo(message);
  } catch(e) {
    alert(e);
    return;
  }
}

function transpose(file, pattern, word) {
  var xls = WScript.CreateObject("Excel.Application");
  xls.Visible = false;

  try {
    xls.Workbooks.Open(getAbsolutePath(file));
  } catch (e) {
    alert(e);
    return;
  }

  try {
    var value = "";
    // 000-00-00-0000のような文字列にマッチする正規表現
    // オブジェクトを作成
    var regex = new RegExp(/\d{3}-\d{2}-\d{2}-\d{4}/i);
    // 上記にマッチする文字列をファイル名から取得
    var matched = file.match(regex);

    if (matched != null) {
      // シート1のセルB5に設定
      with (xls.Worksheets("Sheet1")) {
        Range("B5").Value = matched;
      }

      // ブックのシート0以外のページヘッダに設定
      for (var i = 1; i <= xls.Worksheets.Count; i++) {
        with (xls.Worksheets.Item(i)) {
          if (Name == "Sheet0") {
	    continue;
	  }
          PageSetup.RightHeader = matched;
	}
      }
    }

  } catch (e) {
    alert(e);
  }

  xls.ActiveWorkbook.Close(true);
}

function getAbsolutePath(file) {
  var fs = WScript.CreateObject("Scripting.FileSystemObject");
  return fs.GetAbsolutePathName(file);
}

function alert(e) {
  var shell = WScript.CreateObject("WScript.Shell");
  var description = "no info";
  if (e.description.length != 0) {
    description = e.description;
  }
  shell.Popup("ERROR: \n" + description, 0, "Error", 0x10);
}

InstallShield実行用スクリプト

InstallShieldでインストーラを作成していると、IDEでの修正はないがインス トーラに含めるモジュールが更新されたのでビルドを行うシチュエーションが 多々ある。そんな場合にInstallShieldのIDEを立ち上げなくても以下のスクリ プトをダブルクリックするだけでインストーラをビルドして、さらにビルドし たsetup.exeを特定のディレクトリにコピーするスクリプトを作ってみた。(InstallShield Developer 7にて検証)

[build.js]
///////////////////////////////////////////////////////////////////////////////
// 定数定義

// InstallShieldのプロジェクトファイル
var project = "xxx.ism";
var product = "製品構成 1";
var release = "リリース 1";

///////////////////////////////////////////////////////////////////////////////
// 
main ();

///////////////////////////////////////////////////////////////////////////////
// 
function main() {

    ////////////////////////////////////////////
    // Create shell object

    var shell = WScript.CreateObject("WScript.Shell");

    ////////////////////////////////////////////
    //
    var IS_HOME   = "C:\\Program Files\\InstallShield\\Developer\\System";
    var IS_BLDCMD = IS_HOME + "\\" + "IsCmdBld.exe";
    var flags     = " -c COMP -a \"" + product + "\" -r \"" + release + "\"";
    var cmd = "\"" + IS_BLDCMD + "\"" + " -p " + project + flags;

    ////////////////////////////////////////////
    // build
    var result = shell.Run(cmd,10,true);
    if (0 < result) {
        shell.Popup("ビルドに失敗しました", 0, "ビルドエラー", 0x10);
	return ;
    }
    //WScript.Echo(cmd);

    ////////////////////////////////////////////
    // copy
    var s  = "xxx\\" + product;
	s += "\\" + release;
	s += "\\DiskImages\\DISK1\\setup.exe";
    var d = "..\\target\\xxx-Setup-" + getDateString() + ".exe";

    var src = shell.CurrentDirectory + "\\" + s;
    var dst = shell.CurrentDirectory + "\\" + d;
    
    copy(src, dst);
    
}

///////////////////////////////////////////////////////////////////////////////
// 
function copy(src, dst) {
    var fs = WScript.CreateObject("Scripting.FileSystemObject");
    var relevant = "";
    try {
        relevant = src;
    	var f = fs.GetFile(src);
        var copiedFile = dst;
	var n = 1;
        do {
            copiedFile = copiedFile.replace(
                /(-\d{8})(?:-\d+)?.exe/g,
                "$1-" + n + ".exe"
            );
	    n++;
	} while (fs.FileExists(copiedFile));
	WScript.Echo(src + "\n->" + copiedFile);

	relevant = copiedFile;
	f.Copy(copiedFile);
    } catch (e) {
        var description = "no info";
        if (e.description.length != 0) {
            description = e.description;
        }
        var message = "ERROR: Cannot copy file (" + description + ")\n";
        message += relevant;
        WScript.Echo(message);
        return;
    }
}

function getDateString() {
    var d = new Date();
    var s = "";

    s += d.getYear();
    s += format(d.getMonth() + 1) ;
    s += format(d.getDate());

    return s;
}

function format(value) {
    if (0 <= value && value < 10) {
        return "0" + value;
    }
    return value;
}

ファイルコピースクリプト

決まったファイルを決まったディレクトリにコピーするスクリプトを書いてみた。
バッチファイルの方が簡単に書ける。だけど、1回のダブルクリックでコピーが出来ちゃうので楽は楽。
///////////////////////////////////////////////////////////////////////////////
// src : dst 
var _copiedFiles = {
  "xxxx.exe" : "..\\..\\target\\",
  "xxxx.ini" : "..\\..\\target\\"
};

///////////////////////////////////////////////////////////////////////////////
//

main();

///////////////////////////////////////////////////////////////////////////////
//
function main() {
  var shell = WScript.CreateObject("WScript.Shell");
  var fs = WScript.CreateObject("Scripting.FileSystemObject");
  var relevant = "";
  try {
    for (key in _copiedFiles) {
      relevant = key;
      var parent = (key.lastIndexOf("\\") != -1) ?
        key.substring(0, key.lastIndexOf("\\")) : ".";
      //WScript.Echo(parent);
      if (fs.FolderExists(parent) && fs.FolderExists(_copiedFiles[key])) {
        fs.CopyFile(key, _copiedFiles[key], true);
      } else {
        shell.Popup(
          "コピーに失敗しました:\n    [" + relevant + "]",
          0, "コピーエラー", 0x10
        );
	return;
      }
    }
  } catch (e) {
    var description = "no info";
    if (e.description.length != 0) {
      description = e.description;
    }
    var message = "ERROR: Cannot copy file (" + description + ")\n";
    message += relevant;
    WScript.Echo(message);
    return;
  }
  shell.Popup("コピー完了しました", 0, "Complete...", 0);
}

poseidon起動スクリプト

WSHで"poseidon for uml 4.1"を起動するスクリプトを書いていたのでメモ。
これだとCMDプロンプトとか出ないのですっきり。
////////////////////////////////////////////////
// 
main ();

////////////////////////////////////////////////
// 
function main() {

    ////////////////////////////////////////////
    // Create shell object

    var shell = WScript.CreateObject("WScript.Shell");

    var env = shell.Environment("PROCESS");

    ////////////////////////////////////////////
    //
    var version   = "poseidonCE-4.1.0";
    var JAVA_HOME = shell.ExpandEnvironmentStrings(env("JAVA_HOME"));
    var JAVACMD   = "javaw";
    var WORK_HOME = shell.ExpandEnvironmentStrings(env("HOME"));
    var instdir   = "E:\\pub\\management\\poseidon\\" + version;
    var CLASSPATH = "";

    CLASSPATH    +=  "" + instdir + "\\lib\\concurrent_license_server.jar";
    CLASSPATH    += ";" + instdir + "\\lib\\enterprise.jar";
    CLASSPATH    += ";" + instdir + "\\lib\\poseidon2.jar";
    CLASSPATH    += ";" + instdir + "\\lib\\uml14.jar";
    CLASSPATH    += ";" + JAVA_HOME + "\\jre\\lib\\rt.jar";

    var classpath = " -classpath " + CLASSPATH + " ";
    var flags     = " -Xms64m -Xmx384m " + classpath;
    var debug     = "";
    var saxdriver = " -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser";
    var home      = " -Dposeidon.java.home=" + JAVA_HOME + " ";
    var poseidon  = " -Dposeidon.user.dir.CE=\"" + WORK_HOME + "\" ";
    var entry     = " com.gentleware.poseidon.Poseidon";

    var cmd = JAVACMD + flags + debug + home + poseidon + entry;

    shell.Run(cmd);

}