WSH のサンプル

初版作成  2009.10.6
最終更新  2024.04.01


◆◆ フォルダの中から指定したファイルのみをコピーする ◆◆


下記のスクリプトは以下のファイルのうち、
変更したファイルのみをコピーします。

・home_dir/project/doc の中の指定された文書ファイル
・home_dir/project/c++builder6 の中の指定されたフォルダの中で
  拡張子が cpp, h, dfm, exe, mak, res, dpr のファイル
・home_dir/project/vc++6 の中の指定されたフォルダの中で
 拡張子が cpp, dsp, dsw, h のファイルと Debug ディレクトリの中の exe ファイル

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

◆◆ スクリプトが存在するフォルダの中の docx ファイルを全て印刷する ◆◆


'
'  フォルダ内の Word ファイルを全て印刷する
'                                              by T. Yabu
'  2020.7.26  初版作成
'
'  参考サイト
'  https://qiita.com/im_vyydk/items/c473b2cf5a004d86d6e1
'  https://bayashita.com/p/entry/show/33

Option Explicit

Dim objFileSys
Dim objFolder
Dim objFile
Dim strExtension
Dim objDoc
Dim objWord
Dim objWshShell
Dim cwd
Dim filename

'  ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")

'  カレントフォルダのオブジェクトを取得
Set objFolder = objFileSys.GetFolder(".")

'  Word
Set objWord = CreateObject("Word.Application")
objWord.Visible = True

Set objWshShell = WScript.CreateObject("WScript.Shell")
cwd = objWshShell.CurrentDirectory

'FolderオブジェクトのFilesプロパティからFileオブジェクトを取得
For Each objFile In objFolder.Files
    '取得したファイルのファイル名を表示
    strExtension = objFileSys.GetExtensionName(objFile.Name)
    If strExtension = "docx" Then
        filename = cwd + "\" + objFile.Name
'        WScript.Echo filename
        Set objDoc = objWord.Documents.Open(filename)
        objDoc.PrintOut
        objDoc.Close
    End if
Next

objWord.Quit