2020/12/12(土) [n年前の日記]
#1 [prog] JScriptを少しだけ勉強中
Windows10 x64 20H2上で、複数のファイルの更新日時を現在時刻にしたいなと。その際、ファイル名でソートした順番で、1秒ずつ時間がずれた感じで更新したい。要するに、touchコマンドっぽいことをやりたい。
以前ネットで入手した .vbs (VBScript) が手元にあって、それを使わせてもらえば、ドラッグアンドドロップした複数ファイルの更新日時を現在時刻に変更できるのだけど。その .vbs はファイル名でソート等はしてくれない。sort関数ぐらいあるやろ、さくっと追加できるやろ、と安易な予想をしながら調べてみたら、VBScript にはそんな関数は用意されてないらしい。自分でソート処理を書くか、ADO とやらを使ってソートさせるのだとか。
ソート処理を書くか…でも面倒臭いな…いっそ Perl や Ruby や Python で書き直せないかと少し調べていたのだけど、ふと、Windows の WSH(Windows Script Host)には JScript もあったなと思い出して。そっちを調べてみたら sort関数がフツーに用意されてたので、試しに JScript で書いてみようかな、と。
こんな感じになった。
UpdateFileModifiedTime.js として保存。エクスプローラ等から複数ファイルをドラッグアンドドロップすれば更新日時が現在時刻になる。
元にした .vbs と変数名も一部同じだったりするけれど…。まあ、これで目的は果たせたからOKってことで。
ファイルの更新日時を現在時刻にするあたりで少しハマった。.vbs なら Now関数が用意されているので、
以前ネットで入手した .vbs (VBScript) が手元にあって、それを使わせてもらえば、ドラッグアンドドロップした複数ファイルの更新日時を現在時刻に変更できるのだけど。その .vbs はファイル名でソート等はしてくれない。sort関数ぐらいあるやろ、さくっと追加できるやろ、と安易な予想をしながら調べてみたら、VBScript にはそんな関数は用意されてないらしい。自分でソート処理を書くか、ADO とやらを使ってソートさせるのだとか。
ソート処理を書くか…でも面倒臭いな…いっそ Perl や Ruby や Python で書き直せないかと少し調べていたのだけど、ふと、Windows の WSH(Windows Script Host)には JScript もあったなと思い出して。そっちを調べてみたら sort関数がフツーに用意されてたので、試しに JScript で書いてみようかな、と。
こんな感じになった。
// ドラッグ&ドロップしたファイルの更新日時を更新する。 // ファイル名でソートしてから処理をする。 var args = WScript.Arguments; var fs = new ActiveXObject( "Scripting.FileSystemObject" ); var sh = new ActiveXObject( "Shell.Application" ); var list = new Array(); var result = ""; for ( var i=0; i < args.length; i++ ) { list.push(args(i)); } list.sort(); for ( var i=0; i < list.length; i++ ) { var file = list[i]; if ( fs.FileExists(file) ) { var ofile = fs.GetFile(file); // var pdir = ofile.ParentFolder + "\\"; // var filename = ofile.Name; var filename = fs.GetFileName(file); var ofolder = sh.Namespace(fs.GetParentFolderName(file)); var ofolderitem = ofolder.ParseName(filename); var now = new Date(); ofolderitem.ModifyDate = now.toLocaleString(); result = result + filename + " , " + ofile.DateLastModified + " > " +ofolderitem.ModifyDate + "\n"; } else { result = result + "Not Found " + file + "\n"; } WScript.Sleep(1200); } WScript.Echo(result); list = null; sh = null; fs = null;
UpdateFileModifiedTime.js として保存。エクスプローラ等から複数ファイルをドラッグアンドドロップすれば更新日時が現在時刻になる。
元にした .vbs と変数名も一部同じだったりするけれど…。まあ、これで目的は果たせたからOKってことで。
ファイルの更新日時を現在時刻にするあたりで少しハマった。.vbs なら Now関数が用意されているので、
objFolderItem.ModifyDate = Nowと書けば済むのだけど、JScript では Now関数は無いっぽくて、どうも以下のように書くらしい。
var now = new Date(); ofolderitem.ModifyDate = now.toLocaleString();new Date() を使うらしいことは分ったけど、.toLocaleString() に辿り着くまで結構時間がかかってしまった…。
[ ツッコむ ]
以上です。