バッチでファイルを部分一致検索する

バッチ

バッチで既にあるファイルを参照するとき、ファイル名の日付部分が変わっていたりバージョンが変わっていたりして固定のファイル名では対処できない場合がある。

なので、ファイル名の固定部分で検索して正式なファイル名を取得させることにした。

バッチの内容

[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 関数ここまで

動きは同じですが、要となる処理を関数化したので複数回使用するのに向いています。

コメント

タイトルとURLをコピーしました