すみません一度目の回答のコードは無視してください
参照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を参照して下さい
元フォルダを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時間以内
・未来※まずないと思いますが、面倒なので移動にしました
上記のように動くハズですが
テストデータなどで確認するよう
以上
補足
回答ありがとうございます。 返信が遅くなり申し訳ありません。 何度か検証を繰り返して、ファイルが問題なく移動されることを確認しました。 ただ、ファイルを移動する際にファイルが入っていた「ランダムな文字列のフォルダ」が削除できずにいます。 こちらの削除についてもお伺いしてよろしいでしょうか?