Notes_JP

あまり知られていないこと

【まとめ】便利なバッチファイル (ループ・日付名フォルダ作成・pdfを取出す・リネーム etc.)

よく使うバッチファイルのテンプレートを紹介します.
変数を変更して使って下さい.

ループ処理

『ループ回数』を変数として使って何か処理をしたい場合.
例えば,奇数番号を含む文字列を生成したい場合など.

REM *****************************************
REM * Template of loop
REM * Repeat until LoopNum
REM *****************************************
@echo off
set Counter=0
set LoopNum=
:loop1
  set /a Counter=%Counter%+1
  REM Write process below
      
if not %Counter% == %LoopNum% goto loop1

変数
  • Counter: ループ回数をカウント
  • LoopNum: ループする回数

年月日時間(YYYYMMDDHHMMSS)の名前フォルダを作成する

Desktopに作成

REM **************************************************************************
REM * Make a directory named YYYYMMDDMMSS on Desktop
REM **************************************************************************
@echo off
   set YYYYMMDD=%DATE:~-10%
   set YYYYMMDD=%YYYYMMDD:/=%
   set HHMMSS=%time:~0,8%
   set HHMMSS=%HHMMSS: =0%
   set HHMMSS=%HHMMSS::=%
   set DIR_NAME=%HOMEDRIVE%%HOMEPATH%\Desktop\%YYYYMMDD%%HHMMSS%
   mkdir %DIR_NAME%

特定フォルダ以下の「全階層」にある,全てのpdfファイルを取り出す

  • 「全階層」というのは,『「フォルダ内のフォルダ」+「フォルダ内のフォルダ内のフォルダ」+ ・・・』全てを対象にするという意味です.
  • もちろん,".txt"や".xlsx"でもOK.
  • 上の例と組み合わせれば,「pdfだけを,年月日時間(YYYYMMDDHHMMSS)の名前フォルダにコピーする」ことも可能.
REM *****************************************
REM * Recursively copy all pdf files 
REM * to the target directory 
REM *****************************************
@echo off
DIR_NAME=
for /R %%f in (*.pdf) do copy "%%f" %DIR_NAME%\

変数
  • DIR_NAME: コピー先フォルダのpath

ファイル名の一括変更(特定フォルダ内 / ファイルリストを読み込み)

①「特定フォルダ内の,全ての".xlsx"ファイル」を対象にする場合

  1. 作業フォルダを,デスクトップに作った年月日時刻のフォルダにコピー
  2. コピーしたフォルダにあるファイルをリネーム
    • 『ABCD_Rab.xlsx』を『 Prefix + ABCD + Suffix + .xlsx』にリネームする
REM *****************************************
REM * Edit file names in the directory
REM * %~nF:File name of %F
REM * %~xF:EXTENSION of %F
REM *****************************************
@echo off
   set Prefix=""
   set Suffix=""
   set DIR=%~dp0
   pushd %DIR%

REM 1. Make Directory
   set YYYYMMDD=%DATE:~-10%
      set YYYYMMDD=%YYYYMMDD:/=%
   set HHMMSS=%time:~0,8%
      set HHMMSS=%HHMMSS: =0%
      set HHMMSS=%HHMMSS::=%
   set NewDir=%DIR%\%YYYYMMDD%%HHMMSS%
   mkdir %NewDir%

REM 2. Rename
   for %%F in (*.xlsx) do call :sub "%%F"
   popd
   goto :EOF

   :sub
      copy "%DIR%%~1" %NewDir%

      set BEFORE=%~1
      set FILENAME=%~n1
      set FILENAME=%FILENAME:~0,-4%
      set EXTENSION=%~x1
      set AFTER=%Prefix%%FILENAME%%Suffix%%EXTENSION%

      pushd %NewDir%
      ren "%BEFORE%" "%AFTER%"
      popd
   goto :EOF

変数
  • DIR: 対象フォルダ.
    • バッチファイルのある場所にしたい場合,DIR=%~dp0とする.
  • Prefix: ファイル名の先頭に付加する文字列
  • Suffix: ファイル名の末尾に付加する文字列

②「filelist.txtに書き込まれているファイルだけ」を対象に処理を行う場合

『① 特定フォルダ内の全ての".xlsx"を対象にする場合』で,

for %%F in (*.xlsx) do call :sub "%%F"

の部分を

for /f "tokens=1* delims=: eol=" %%X in ('findstr /n "^" %DIR%filelist.txt') do call :sub "%%Y"

に変更すれば,「filelist.txtに書き込まれているファイルだけ」を対象に処理を行うことが出来る.