VBScriptでフォルダコピー

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

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA