Windows Script Host のサンプル

2009.10.06 初版  
2009.10.06 最終改訂


開発用ディレクトリの中に散らばったファイルのうち、必要な ファイルのみを配布用ディレクトリにコピーする Windows Script Host の サンプルです。

以上のファイルのうち、更新したファイルのみをコピーする VBScript スクリプト です。適当に改変してお使いください。
set objFs = CreateObject("Scripting.FileSystemObject")
copied_fname = ""

home_dir = "C:\Documents and Settings\user-name\My Documents"

'----------- 文書ファイルをコピーする -------------

src_dir  = home_dir + "\project\doc"
dist_dir = "\\another-machine\user-name\project\doc"
file_list = _
   Array("aaa.doc","bbb.doc", _
         "ccc.doc","ddd.doc")

for each fname in file_list
   call ycopy(fname,src_dir,dist_dir)
next

'----------- Visual C++6 のファイルをコピーする --------

src_dir0 = home_dir + "\project\vc++6"
folder_list = _
   Array("dir1","dir2", _
         "dir3","dir4")

dist_dir0 = "\\another-machine\user-name\project\vc++6"

for each dir in folder_list

   src_dir = src_dir0 + "\" + dir

   set objFolder= objFs.GetFolder(src_dir)
   dist_dir = dist_dir0 + "\" + objFolder.name
'       .name で最後の部分を切り出す
'       この場合は dist_dir = dist_dir0 + "\" + dir でも良いが、
'       .name の使い方の見本を見せるため、あえてこう記述する。

   for each fname in objFolder.Files  ' そのフォルダ内の全ファイル
      fname   = Lcase(fname.Name)                     ' ファイル名
      extname = LCase(objFs.GetExtensionName(fname))  ' 拡張子
      if extname = "cpp" or extname = "dsp" or extname = "dsw" or _
         extname = "h" then
         call ycopy(fname,src_dir,dist_dir)
      end if
   next

   src_dir = src_dir0 + "\" + dir + "\Debug"
   dist_dir = dist_dir0 + "\" + objFolder.name + "\Debug" 

   fname = dir + ".exe"
   call ycopy(fname,src_dir,dist_dir)

next

'------------ C++Builder6 のファイルをコピーする ------------

src_dir0 = home_dir + "\project\c++builder6"

folder_list = _
   Array("folder1","folder2", _
         "folder3","folder4)

dist_dir0 = "\\another-machine\user-name\project\c++builder6"

for each dir in folder_list

   src_dir = src_dir0 + "\" + dir

   set objFolder= objFs.GetFolder(src_dir)
   dist_dir = dist_dir0 + "\" + objFolder.name
'       .name で最後の部分を切り出す
'       この場合は dir_dir = dist_dir0 + "\" + dir でも良いが、
'       .name の使い方の見本を見せるため、あえてこう記述する。

   for each fname in objFolder.Files  ' そのフォルダ内の全ファイル
      fname   = Lcase(fname.Name)                     ' ファイル名
      extname = LCase(objFs.GetExtensionName(fname))  ' 拡張子
      if extname = "cpp" or extname = "h" or extname = "dfm" or _
         extname = "exe" or extname = "mak" or extname = "res" or _
         extname = "dpr" then
         call ycopy(fname,src_dir,dist_dir)
      end if
   next
next

'       ------------------------------------

if copied_fname = "" Then
   MsgBox("コピーしたファイルはありません")
Else
   MsgBox("コピーしたファイルは以下の通りです"&vbCR&vbCR&copied_fname&vbCR&"終了しました")
End If

'=============== 更新したファイルのみコピーする ===============
'
'   コピーしたファイル名をグローバル変数 copied_fname に入れる
'   dist_dir が存在しない場合は作成する
'

sub ycopy(fname,src_dir,dist_dir)

   src_fname  = src_dir  + "\" + fname
   dist_fname = dist_dir + "\" + fname
   dist_dir2  = dist_dir + "\"

'   MsgBox("fname = "&fname&"  src_fname = "&src_fname&"  dist_fname = "&dist_fname)

   if objFs.FileExists(src_fname) = False Then
      MsgBox("ファイル "&src_fname&" がありません。スキップします。")
'      WScript.Quit
      exit sub
   else
      set objFile1 = objFs.GetFile(src_fname)
   end if

   if objFS.FolderExists(dist_dir2) = False Then  ' コピー先フォルダがないときは
      objFS.CreateFolder(dist_dir2)               ' 作成する
   end if

   if objFs.FileExists(dist_fname) = True Then    ' コピー先にファイルがあるときは
      set objFile2 = objFs.GetFile(dist_fname)    ' 日付を比較する

      date1 = objFile1.DateLastModified
      date2 = objFile2.DateLastModified

      diff_sec = DateDiff("s",date1,date2)

      if diff_sec < 0 then
         objFile1.copy dist_dir2
         copied_fname = copied_fname+src_fname+vbCR
      end if
   else
      objFile1.copy dist_dir2
      copied_fname = copied_fname+src_fname+vbCR
   end if

End sub