普段コマンドラインを使わない人から見ると、コマンド一発でファイルの整理を終えてしまうコマンド使いが羨ましいらしいです。
でも、プログラミングして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(新規フォルダ)にコピーされました。


コメント