JavaScript
正規表現
WSH

WSHでファイルリネームツールを作るよ


WSHでファイルリネームツールを作るよ

以下の仕様


  • Drag & Dropで、ファイル(複数可)をリネーム

  • 基本文字列+置換前ファイル名 にリネーム可

  • 基本文字列+4桁の連番 にリネーム可

  • 基本文字列未指定時は、元ファイル名を置換のみ行う

  • 置換条件に正規表現使用可

[:bangbang:] 注意:元ファイルを直接リネームする為、バックアップ推奨



本体(FileRenamer.wsf)

// UTF-16LEで保存すること.

<job>
<script language="JavaScript" src="CommonUtil.js"></script>
<script language="JavaScript" src="IeUtil.js"></script>
<resource id="inputHtml">
<![CDATA[
<html>
<head>
<meta charset="utf-8"/>
<style type="text/css">
<!--
body { font-family:'メイリオ',Meiryo; }
ul { padding-left: 0px; list-style-type: none; }
li[id="wrapper"] { text-align:center; }
input[type="button"] {
font-size: 1.4em; font-weight: bold; padding: 10px 30px;
-moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px;
}
-->
</style>
</head>
<body>
<form>
<input type="hidden" id="CLICKED" value="false" />
<ul>
<li>リネーム条件入力(正規表現対応)</li>
<br/>
<li>基本文字列: <input type="text" id="baseStr" value="baseName" /></li>
<li>※未指定時は、置換のみ行います。</li>
<br/>
<li>対象文字列: <input type="text" id="targetStr" /></li>
<li>置換文字列: <input type="text" id="replaceStr" /></li>
<br/>
<li><input type="checkbox" id="allReplace" checked />該当文字列は全置換する</li>
<li><input type="checkbox" id="sequence" />4桁の連番を付与する</li>
<br/>
<li id="wrapper">
<input type="button" onClick="quit()" value="実行" />
</li>
</ul>
</form>
<script>
document.body.style.overflow = "hidden";
function quit(){
document.getElementById( "CLICKED" ).value="true";
window.open('','_self').close();
}
</script>
</body>
</html>
]]>

</resource>
<script language="JavaScript">
// 引数チェック.
if ( WScript.Arguments.length === 0 ){
$.info( "ファイルをD&Dしてください.", "エラー" );
WScript.Quit();
}

var displaySize = $.IE.getDisplaySize();
var replaceInfo = $.IE.displayCustomWindow(
displaySize.width, displaySize.height, 320, 380, getResource( "inputHtml" ), "置換条件入力"
);

// 実行.
var reg = new RegExp( replaceInfo.targetStr, replaceInfo.allReplace ? 'g' : '' );
var cnt = 1;
$.mapX( WScript.Arguments, function( path ){
var file = $.Fso.getFile( path );
var ext = $.Fso.getExtensionName( path );
if ( replaceInfo.sequence ){
file.Name = replaceInfo.baseStr + $.getZeroPadding( cnt, 4 ) + "." + ext;
cnt++;
} else {
var baseStr = replaceInfo.baseStr ? replaceInfo.baseStr : "";
var replaceStr = file.Name.replace( reg, replaceInfo.replaceStr );
var resultStr = baseStr + replaceStr;
if ( resultStr && resultStr != file.Name ) file.Name = resultStr;
}
});

// 終了.
$.info( "done.", "end" );
WScript.Quit();
</script>
</job>



共通FW(CommonUtil.js)

こちら



Excel用FWっぽいの(XlsxUtil.js)

こちら


総括・ハマりポイント


  • 特に嵌りなし

  • htmlに凝るとソースの大半がhtmlだらけになる印象。なんとかならないか


  • D&Dだと順序保障できない

    Enumeratorを使ったfor文が順序保障しない模様。standardなfor文に変更。

     ⇒勘違い。順序は下記の法則で行われていることがわかった。

    □file1
    □file2
    ■file3
    □file4
    □file5
    file3にマウスを置いてD&Dすると、
    file3 ⇒ file4 ⇒ file5 ⇒ file1 ⇒ file2
    の順で、WScript.Argumentsに引き渡される様子。
    file1 ⇒・・・⇒ file5で処理したい場合は、file1にマウスを置いて、D&DすればOK。