Windows における処理の自動化

最終修正  2015.6.10


◆◆ コマンドプロンプト ◆◆

Windows が普及する前は MS-DOS という CUI の OS が使われていた。
「ファイルのコピー、削除、名前の変更」などの操作は
キーボードからコマンドを入力して行う。

「スタート」→「プログラムの検索」で cmd と入力すると、
cmd.exe が起動し、コマンドプロンプトのウィンドウが開く。
ここで MS-DOS と同等の操作ができる。

  C:\Users\user-name>

は現在居るフォルダを示している(以下、現在のフォルダと記す)。

良く使うコマンドは以下の通り。
ドライブ名、フォルダ(ディレクトリ)名、ファイル名は
大文字小文字を区別しない。

  d:                ドライブの移動 (d ドライブに移動する)

  dir               現在のディレクトリ(フォルダ)の内容を示す。
  dir /w            同上  ファイル名のみを表示する

  cd abc            現在のフォルダの下位の abc という名前のフォルダに移動する
  cd c:\user\yabu\documents   c ドライブのフォルダ \user\yabu\documents に移動する。
  cd ..             階層が一つ上のフォルダに移動する。

windows では「ドキュメント」などで表されるフォルダは
「真の名前」と「表示されるときの名前」が異なる。
例えば「ドキュメント」は documents である。

エクスプローラの一番上の段のフォルダ名が表示されている部分を
クリックすると、「真の名前」が表示される。

ファイルの操作に関するコマンド

  copy a.txt b.txt     a.txt のコピーを同一ディレクトリ内に b.txt という
                       名前で作成する。
  copy a.txt abcd      一つ階層が下にある abcd というフォルダに a.txt をコピー
                       する。

  rename a.txt b.txt   a.txt の名前を b.txt に変更する。

  del a.txt            a.txt を削除する。

  type def.txt         def.txt というファイルの内容を表示する
                       テキストファイル以外には使用しても意味がない。
  type def.txt | more  同上。1 ページごとに停止する。
                       space キーで次のページ

◆◆ バッチファイル ◆◆

拡張子が bat のテキストファイルをバッチファイルと言う。
メモ帳などで読み書きする。その中にコマンドを書く。

バッチファイルをダブルクリックすると、
ファイル中に書いたコマンドが順番に実行される。

(例)
------ a.bat の内容 ここから ---------
rem コメント        <--- rem で始まる行はコメント行
copy a.txt ..       <--- a.txt を 1 階層上のフォルダにコピーする
del b.txt           <--- b.txt を削除
pause               <--- 一時停止して、何らかのキーが押されるのを待つ
------------- ここまで -------------

a.bat が存在するフォルダにおいて、
上記の 2 つの命令を、コマンドプロンプトから打ったのと
同じ効果がある。

bat ファイルはメモ帳などで編集できるので、
「大量のファイルのリネーム」など手作業では難しいことを
バッチファイルを使って行うことができる。

◆◆ wsh ◆◆

bat ファイルで if, 繰り返し などを記述するのは、
少々厄介である。bat ファイルはコマンドを順番に実行する
作業を自動化するために用いるのが良い。

より複雑なことをするには、wsh (Windows Scripting Host) を使う。
wsh は拡張子が vbs のテキストファイルである。
非常に多機能である。

   なお、perl, ruby, phtyon などを使う方法もあるが、
   処理系をインストールして環境変数を設定するなど、
   少し敷居が高いので、ここでは述べない。

例として、コピー元フォルダ内の指定したファイルのうち、
更新したファイルのみを、コピー先フォルダに
コピーするスクリプトを示す。

--------------------- ここから ------------------
'
'   フォルダ src_dir  中のファイル flist (複数)を
'   フォルダ dist_dir にコピーする
'   ただし、dist_dir 内に同一日付のファイルが存在するときはコピーしない。
'   dist_dir はあらかじめ作成しておく。
'

' ファイルシステムにアクセスするためのオブジェクト
set fsystem = CreateObject("Scripting.FileSystemObject")

copied_fname = ""                     ' コピーしたファイルのリスト
src_dir  = "."                        ' コピー元フォルダ
dist_dir = "D:\work\dir_1"            ' コピー先フォルダ

' コピーするファイルのリスト
flist = Array( "a.docx", "b.xlsx", _
               "c.pptx", "d.txt", "e.jpg")

'       ----- ファイルのコピーを行う -----

i_start = LBound(flist)
i_end   = UBound(flist)

for i = i_start to i_end
    call ycopy(src_dir,flist(i),dist_dir,flist(i))
next

'      ----- コピーを実行したファイルの名前を表示する --------

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

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

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

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

   if fsystem.FileExists(src_fname) = False Then  ' コピー元ファイルがない
      MsgBox("ファイル" & vbCR & vbCR & src_fname & vbCR & vbCR & _
             "がありません。無視します。")
      exit sub
   else
      set src_file = fsystem.GetFile(src_fname)
   end if

'   MsgBox("dist_dir = "&dist_dir)

   if fsystem.FolderExists(dist_dir) = False Then  ' コピー先フォルダがない
      MsgBox("コピー先フォルダ" & vbCR & vbCR & dist_dir & vbCR & _
             vbCR & "がありません。処理を中断します。")
      WScript.Quit
   end if

   if fsystem.FileExists(dist_fname) = True Then ' コピー先に既にファイルが
                                                 ' あるとき、日付を比べる
      set dst_file = fsystem.GetFile(dist_fname) 
      date1 = src_file.DateLastModified
      date2 = dst_file.DateLastModified

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

      if diff_sec < 0 then          ' コピー元の方が新しいときコピーする
         src_file.copy dist_fname
         copied_fname = copied_fname + src_fname + vbCR
      end if
   else
      src_file.copy dist_fname
      copied_fname = copied_fname + src_fname + vbCR
   end if

End sub
----------------------- ここまで -----------------