• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ファイルの作成日で動作するバッチ)

ファイルの作成日で動作するバッチ

このQ&Aのポイント
  • ファイルの作成日を基準にしたバッチの作成方法を教えてください。Windows Server 2008 R2の環境で動作させたいです。
  • 特定のフォルダ内のファイルの中から、作成日が24時間以内のファイルを別のフォルダに移動するバッチを作成したいです。また、ファイルを移動させる際にフォルダは削除したいです。
  • また、移動させるファイルの条件として「xxx.pdf」「xxx.csv」のファイルであることも考慮してください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

すみません一度目の回答のコードは無視してください 参照URLにあります「バッチファイルで日付の操作(2)」にあるバッチと、 以下のバッチを同じ場所に保存して使ってください。 なお、URLのバッチはcall対象には、ファイル名の前に「%~dp0」 「sub.bat」を参照するときにも「%~dp0」を入れてください。 ファイル名はそれぞれ、コメントにあるものを使ってください ――――――――――――――ここから――――――――――――――― @echo off setlocal enabledelayedexpansion set tarFol=%~dp0A\ set sendFol=%~dp0B\ if not exist "%tarFol%" (echo "%tarFol%"がありません&pause&exit) else (pushd "%tarFol%") rem 現在時刻取得 rem 現在時刻を取得(dateやtimeの環境変数を確認すること) rem 作成した環境は rem date:2016/06/10 rem time: 8:09:06.81 rem また、秒以下は誤差範囲内としてチェックしてません set ymd=%date% set hMs=%time% rem set ymd=2016/06/09 rem set hMs= 8:09:06.81 rem 本日の一日前を取得 call %~dp0back 1 %ymd% set ymd=%dt% set tmp_ymd=%ymd:/=% set hMs=%hMs:~0,8% set hMs=%hMs: =% set hMs=%hMs::=% set hMs=%hMs:.=% rem 数字以外が消えてるか確認 rem この下二つは、数字以外が消えてるのを確認したらremを行頭に追加して無効にする set reigaiFlag=False set extFlag=False set /a reigaiCnt=0 set /a extCnt=0 rem コード下のStart~Endの間にある値を配列にセット for /f "usebackq delims=" %%f in ("%~dpnx0") do ( set line=%%f rem ・処理例外フォルダ名 if "!line!"=="rem 処理例外フォルダ名End" ( set reigaiFlag=False ) if "!reigaiFlag!"=="True" ( set /a reigaiCnt+=1 call :ReigaiSet !line! !reigaiCnt! ) if "!line!"=="rem 処理例外フォルダ名Start" ( set /a reigaiCnt=0 set reigaiFlag=True ) rem ・移動対象拡張子 if "!line!"=="rem 移動対象拡張子End" ( set extFlag=False ) if "!extFlag!"=="True" ( set /a extCnt+=1 call :ExtSet !line! !extCnt! ) if "!line!"=="rem 移動対象拡張子Start" ( set /a extCnt=0 set extFlag=True ) ) rem フォルダ探索 for /f "usebackq delims=" %%g in (`dir /b /ad`) do ( set folN=%%~nxg echo "!folN!" call :ReigaiCheck "!folN!" rem 例外フォルダでなければ、ディレクトリ移動して移動処理メソッドに移る if "!ReigaiCheckFlag!"=="True" ( pushd "%cd%\!folN!" call :ExtMove popd ) else (echo フォルダフラグFalse) echo ____________________ ) echo -fin- pause exit :ExtMove for /f "usebackq delims=" %%g in (`dir /b /a-d`) do ( set fileName=%%g set fileExt=%%~xg call :ExtCheck "!fileExt!" echo  "!fileName!" if "!ExtCheckFlag!"=="True" ( rem echo   拡張子:移動対象 call :TimeCheckAndMove ) else ( rem echo   拡張子:移動非対象 ) echo  --------------- ) exit /b rem チェックラベル(~Check) rem 引数と配列を比べ、一致するものが1つでもあればFalseを返す :ReigaiCheck set tarFo=%1 set tarFo=%tarFo:"=% set ReigaiCheckFlag=True for /l %%r in (1,1,%reigaiCnt%) do ( rem echo !reigai[%%r]! if "!reigai[%%r]!"=="%tarFo%" (set ReigaiCheckFlag=False) ) exit /b rem 引数と配列を比べ、一致するものが1つでもあればTrueを返す(ReigaiCheckとは逆だヨん) :ExtCheck set tarExt=%1 set tarExt=%tarExt:"=% set ExtCheckFlag=False for /l %%e in (1,1,%extCnt%) do ( rem echo !ext[%%e]! if "!ext[%%e]!"=="%tarExt%" (set ExtCheckFlag=True) ) exit /b rem 配列設定(~Setラベル) :ReigaiSet set reigai[%2]=%1 exit /b :ExtSet set ext[%2]=%1 exit /b rem 24時間しか考慮してません。それ以上でも以下でも時間の指定が変更になると判定できません :TimeCheckAndMove for /f "usebackq skip=5 delims=" %%g in (`dir /a-d /tc "!fileName!"`) do ( set sakuseibi=%%g set sakuseiji=!sakuseibi:~12,5! set sakuseibi=!sakuseibi:~0,10! goto :TCAM_Sub ) :TCAM_Sub set sakuseiji=!sakuseiji::=! set sakuseiji=!sakuseiji!00 set sakuseiji=!sakuseiji:~-6! if "!sakuseiji:~0,1!"=="0" (set sakuseiji=!sakuseiji:~-5!) set dt= rem call %~dp0back 1 %sakuseibi:~0,10% rem call %~dp0back 1 %sakuseibi% rem set dt=%dt:/=% set dt=%sakuseibi% set dt=%dt:/=% set moveFlag=False set jisaChance=False echo %tmp_ymd%:%hMs% echo %dt%:%sakuseiji% rem 年月日差(同一及び未来) rem 時差 if %dt% GEQ %tmp_ymd% ( set jisaChance=True set moveFlag=True ) if "%hMs%" GEQ "%sakuseiji%" ( set moveFlag=True ) if "%jisaChance%"=="False" ( set moveFlag=False ) if %dt% GTR %tmp_ymd% ( set moveFlag=True ) echo 結果:%moveFlag% if "%moveFlag%"=="True" ( echo 移動対象 echo "%cd%\!fileName!" "!sendFol!" move "%cd%\!fileName!" "!sendFol!" ) exit /b rem -----設定値は以下から、StartとEndのコメントは保持するように!----- rem 例外が増えた場合はstartとendの間にフォルダ名を追加してネ rem 処理例外フォルダ名Start work rem 処理例外フォルダ名End rem 移動対象拡張子が増えた場合はstartとendの間にフォルダ名を追加してネ rem 移動対象拡張子Start .pdf .csv rem 移動対象拡張子End ――――――――――――――ここまで――――――――――――――― 何度も回答してご迷惑をかけて申し訳ありません 以上

参考URL:
http://homepage1.nifty.com/jak/batch/jdate.html
snin1107
質問者

補足

回答ありがとうございます。 返信が遅くなり申し訳ありません。 何度か検証を繰り返して、ファイルが問題なく移動されることを確認しました。 ただ、ファイルを移動する際にファイルが入っていた「ランダムな文字列のフォルダ」が削除できずにいます。 こちらの削除についてもお伺いしてよろしいでしょうか?

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

テスト時は、よく注意して下さい ダミーのテストデータは参考URLを参照して下さい 元フォルダをAにして、ダミーをA_dummyなどにすればいいと思います また、timeやdateの形式はPCの環境に依存しますので、その点も確認を (私のWin10の環境はコード中の「rem 作成した環境は」を参照のこと) 現在はバッチと同じ階層にAとBがあるのを想定してます 違う場合はtarFolとsendFolを変更してください また、コード最後にあるコメントは「大変重要」です 決して消さないでください ―――――――――――ここから―――――――――――― @echo off setlocal enabledelayedexpansion set tarFol=%~dp0A\ set sendFol=%~dp0B\ if not exist "%tarFol%" (echo "%tarFol%"がありません&pause&exit) else (pushd "%tarFol%") rem 現在時刻取得 rem 現在時刻を取得(dateやtimeの環境変数を確認すること) rem 作成した環境は rem date:2016/06/10 rem time: 8:09:06.81 rem また、秒以下は誤差範囲内としてチェックしてません set ymd=%date% set hMs=%time% rem 数字に関係ないものをここで削除 set ymd=%ymd:/=% set hMs=%hMs: =% set hMs=%hMs:~0,8% set hMs=%hMs::=% set hMs=%hMs:.=% rem 数字以外が消えてるか確認 rem この下二つは、数字以外が消えてるのを確認したらremを行頭に追加して無効にする set reigaiFlag=False set extFlag=False set /a reigaiCnt=0 set /a extCnt=0 rem コード下のStart~Endの間にある値を配列にセット for /f "usebackq delims=" %%f in ("%~dpnx0") do ( set line=%%f rem ・処理例外フォルダ名 if "!line!"=="rem 処理例外フォルダ名End" ( set reigaiFlag=False ) if "!reigaiFlag!"=="True" ( set /a reigaiCnt+=1 call :ReigaiSet !line! !reigaiCnt! ) if "!line!"=="rem 処理例外フォルダ名Start" ( set /a reigaiCnt=0 set reigaiFlag=True ) rem ・移動対象拡張子 if "!line!"=="rem 移動対象拡張子End" ( set extFlag=False ) if "!extFlag!"=="True" ( set /a extCnt+=1 call :ExtSet !line! !extCnt! ) if "!line!"=="rem 移動対象拡張子Start" ( set /a extCnt=0 set extFlag=True ) ) rem フォルダ探索 for /f "usebackq delims=" %%g in (`dir /b /ad`) do ( set folN=%%~nxg echo "!folN!" call :ReigaiCheck "!folN!" rem 例外フォルダでなければ、ディレクトリ移動して移動処理メソッドに移る if "!ReigaiCheckFlag!"=="True" ( pushd "%cd%\!folN!" call :ExtMove popd ) else (echo フォルダフラグFalse) echo ____________________ ) echo -fin- pause exit :ExtMove for /f "usebackq delims=" %%g in (`dir /b /a-d`) do ( set fileName=%%g set fileExt=%%~xg call :ExtCheck "!fileExt!" echo  "!fileName!" if "!ExtCheckFlag!"=="True" ( echo   拡張子:移動対象 call :TimeCheckAndMove ) else ( echo   拡張子:移動非対象 ) echo  --------------- ) exit /b rem チェックラベル(~Check) rem 引数と配列を比べ、一致するものが1つでもあればFalseを返す :ReigaiCheck set tarFo=%1 set tarFo=%tarFo:"=% set ReigaiCheckFlag=True for /l %%r in (1,1,%reigaiCnt%) do ( rem echo !reigai[%%r]! if "!reigai[%%r]!"=="%tarFo%" (set ReigaiCheckFlag=False) ) exit /b rem 引数と配列を比べ、一致するものが1つでもあればTrueを返す(ReigaiCheckとは逆だヨん) :ExtCheck set tarExt=%1 set tarExt=%tarExt:"=% set ExtCheckFlag=False for /l %%e in (1,1,%extCnt%) do ( rem echo !ext[%%e]! if "!ext[%%e]!"=="%tarExt%" (set ExtCheckFlag=True) ) exit /b rem 配列設定(~Setラベル) :ReigaiSet set reigai[%2]=%1 exit /b :ExtSet set ext[%2]=%1 exit /b :TimeCheckAndMove for /f "usebackq skip=5 delims=" %%g in (`dir /a-d /tc "!fileName!"`) do ( set sakuseibi=%%g set sakuseiji=!sakuseibi:~12,5! set sakuseibi=!sakuseibi:~0,10! set sakuseibi=!sakuseibi:/=! set sakuseiji=!sakuseiji::=! set sakuseiji=!sakuseiji!00 set sakuseiji=!sakuseiji:~-6! if "!sakuseiji:~0,1!"=="0" (set sakuseiji=!sakuseiji:~-5!) echo sakuseiji:!sakuseiji! goto :TCAM_Sub ) :TCAM_Sub echo ファイル日付:"%sakuseibi%":"%sakuseiji%" echo   比較時刻:"%ymd%":"%hMs%" rem 日の差を取得 set /a hisa=%ymd%-!sakuseibi! set /a jisa=%hMs%-!sakuseiji! rem 移動フラグ set /a moveFlag=0 if %hisa% gtr 1 (set /a moveFlag=20) if %hisa% equ 1 (set /a moveFlag=6) if %hisa% equ 0 (set /a moveFlag=0) if %jisa% gtr 0 (set /a moveFlag=%moveFlag%+5) if %jisa% equ 0 (set /a moveFlag=%moveFlag%) if %jisa% lss 0 (set /a moveFlag=%moveFlag%-5) echo %moveFlag% if %moveFlag% gtr 10 (echo 1日以上経過) else ( echo 移動対象 echo "%cd%\!fileName!" "!sendFol!" move "%cd%\!fileName!" "!sendFol!" ) exit /b rem -----設定値は以下から、StartとEndのコメントは保持するように!----- rem 例外が増えた場合はstartとendの間にフォルダ名を追加してネ rem 処理例外フォルダ名Start work rem 処理例外フォルダ名End rem 移動対象拡張子が増えた場合はstartとendの間にフォルダ名を追加してネ rem 移動対象拡張子Start .pdf .csv rem 移動対象拡張子End ―――――――――――ここまで―――――――――――― 日付移動のテストも行いました 移動しない ・1年以上前 ・1か月以上前 ・1日以上前 移動する ・24時間ジャスト ・24時間以内 ・未来※まずないと思いますが、面倒なので移動にしました 上記のように動くハズですが テストデータなどで確認するよう 以上

参考URL:
http://note.chiebukuro.yahoo.co.jp/detail/n386451
すると、全ての回答が全文表示されます。

関連するQ&A