バッチで既にあるファイルを参照するとき、ファイル名の日付部分が変わっていたりバージョンが変わっていたりして固定のファイル名では対処できない場合がある。
なので、ファイル名の固定部分で検索して正式なファイル名を取得させることにした。
バッチの内容
[poweshell]
@echo off
set TMPFILENAME=filelist.txt
rem 検索したいファイル名(部分一致)
set searchstring=before_file_%date:~0,4%%date:~5,2%%date:~8,2%
rem 「dir /B」コマンドでファイルリストを出力
dir /B > %TMPFILENAME%
rem ファイルリストを1行ずつチェック
for /f “delims=” %%i in (%TMPFILENAME%) do (
echo “%%i” | find “%searchstring%” >NUL
if not errorlevel 1 (
set searchfilename=%%i
)
)
del %TMPFILENAME%
rem 発見したファイル名を表示
echo %searchfilename%
pause
[/poweshell]
結果
before_file_20211124-1000.txt 続行するには何かキーを押してください . . .
検索文字の設定は「before_file_20211124」なので部分一致でファイルを検索できました。
もし2つ条件に一致するファイルがあった場合は後で見つけたファイルが結果として出てきます。
主な用途
このバッチだけでは何がやりたいのかよくわからないと思います。
想定している状況はOS再起動前のルーティング状態を保存しておいて、起動後のファイルと比較させたい時です。
ファイル名に実行時間が含まれている場合は、起動前のファイル名を探す必要があります。
バッチの内容(関数バージョン)
@echo off rem 検索したいファイル名(部分一致) set searchstring=before_file_%date:~0,4%%date:~5,2%%date:~8,2% rem 検索したい文字を指定して関数を呼び出す call:dirsearch %searchstring% rem 発見したファイル名を表示 echo %searchfilename% pause rem 関数ここから :dirsearch set TMPFILENAME=filelist.txt rem 「dir /B」コマンドでファイルリストを出力 dir /B > %TMPFILENAME% rem ファイルリストを1行ずつチェック for /f "delims=" %%i in (%TMPFILENAME%) do ( echo "%%i" | find "%~1" >NUL if not errorlevel 1 ( set searchfilename=%%i ) ) del %TMPFILENAME% exit /b rem 関数ここまで
動きは同じですが、要となる処理を関数化したので複数回使用するのに向いています。