普段コマンドラインを使わない人から見ると、コマンド一発でファイルの整理を終えてしまうコマンド使いが羨ましいらしいです。
でも、プログラミングしてGUIツールを作ってしまえばよいことなので、コマンドができることと、情報整理が早いことはイコールとは限りません。
今回はVBscriptでフォルダコピーのツールを作ってみましょう。
実験用フォルダはPowerShellで作っておきます。
C:\Users\takk\Desktop>dir dir1 /b/s | findstr txt C:\Users\takk\Desktop\dir1\100\053\837\2\file7.txt C:\Users\takk\Desktop\dir1\102\629\04\file6.txt C:\Users\takk\Desktop\dir1\112\906\125\4\file8.txt C:\Users\takk\Desktop\dir1\120\308\319\file10.txt C:\Users\takk\Desktop\dir1\138\970\412\file2.txt C:\Users\takk\Desktop\dir1\149\635\671\0\file1.txt C:\Users\takk\Desktop\dir1\151\895\189\8\file5.txt C:\Users\takk\Desktop\dir1\178\016\686\8\file3.txt C:\Users\takk\Desktop\dir1\183\555\127\2\file9.txt C:\Users\takk\Desktop\dir1\225\551\875\file4.txt C:\Users\takk\Desktop>
ドラッグドロップしたフォルダのファイルをメッセージボックスで表示するスクリプトです。
mycopy.vbs
arg=WScript.Arguments.Item(0) pattern=inputbox("pattern") set ws = CreateObject("WScript.Shell") set result = ws.Exec("cmd /c dir /b/s " & arg) set stdout = result.stdout set re = new RegExp re.Pattern = pattern do while not stdout.AtEndOfStream s = stdout.ReadLine() &vbCrLf if re.Test(s) then outs = outs & replace(s , arg , "") end if loop msgbox outs
使ってみます。
このように実験用フォルダをスクリプトにドロップします。
インプットボックスが表示されますので、正規表現を指定します。
マッチしたファイルがメッセージボックスで表示されます。
これを改造して、フォルダコピーツールを作りました。
インプットボックスで入力するのは、新規のフォルダ名と、フィルタ条件です。
mycopy.vbs
set re = new RegExp srcdir_path=WScript.Arguments.Item(0) destdir=inputbox("新規フォルダ名(コピー先)") filter_pattern=inputbox("pattern") re.Pattern = "^(.*)\\.+$" basedir=re.replace(srcdir_path,"$1") srcdir=replace(srcdir_path,basedir,"") destdir_path=basedir &"\"&destdir set ws = CreateObject("WScript.Shell") set result = ws.Exec("cmd /c dir /b/s " & srcdir_path) set stdout = result.stdout re.Pattern = filter_pattern set lis = CreateObject("System.Collections.ArrayList") do while not stdout.AtEndOfStream s = stdout.ReadLine() if re.Test(s) then lis.add replace(s , arg , "") end if loop ws.Exec("cmd /c xcopy /e /t " & srcdir_path & " " &destdir_path&"\") for each src in lis if re.Test(src) then dest=replace(src,srcdir_path,destdir_path) cmdstr="cmd /c copy " & src & " "&dest set result = ws.Exec(cmdstr) end if next
使ってみます。フォルダ名をdir2、フィルタ条件をfile[1-5]とします。
マッチしたファイルのみdir2(新規フォルダ)にコピーされました。
コメント