次のバッチ スクリプトがあります:
set driveletter=F
call :delext "*.foo"
call :delext "*.bar"
call :delext "*.pdf"
:: funcion delext
@echo off
pause
goto:eof
:delext
set delext=%1
del /f/q/s %driveletter%:\"%delext%"
goto:eof
必要なのは、いずれかの拡張子と一致する場合の「エコー」です。
たとえば、 というファイルがありtest.pdf
、拡張子 と一致する場合*.pdf
、出力にエコーを表示したいと思いますmatch pdf
(一致するものがない場合は何も表示しません)。
どうやってやるの?
答え1
私は関数型バッチプログラミングの大ファンです。
ここでの私の解決策は、十分な睡眠をとっていないため、雑なものかもしれませんが、機能し、多かれ少なかれあなたが求めていることを実現することを保証します。
これはおそらく最も非効率的な方法ですが、ディレクトリごとにすべての拡張子を実行するバッチを作成した場合、拡張子について伝えた場合の追跡は少し複雑になりますが、実行は速くなります。
また、変数を使用しない場合は、関数を非常に小さなコードに削減できるため、何が起こっているのかを追うことができます。
@echo off
:: Set the starting path that we will be searching.
Set pathToSearch=C:\users\yo_mamma
cd /d "%pathToSearch%"
if not "%ERRORLEVEL%"=="0" echo Path %PathToSearch% not found&&exit /b 1
Set ExtensionsToCheck="*.foo" "*.txt" "*.bar" "*.pdf"
call :EnumerateExtensions %ExtensionsToCheck%
goto :EOF
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Function "EnumerateExtensions"
:EnumerateExtensions
if "%~1"=="" goto :EOF
Set fileMatchFound=FALSE
Set searchFileMask=%1
for /r %%p in ('.') do call :EnumerateDirectories "%%p" %searchFileMask%
shift
goto :EnumerateExtensions
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Function "EnumerateDirectories"
:EnumerateDirectories
Set directoryPath=%~DP1
Set fileMask=%~2
for %%f in (%fileMask%) do call :MatchFound "%directoryPath%" "%fileMask%" "%%f"
goto :EOF
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Function "MatchFound"
:MatchFound
if not "TRUE"=="%fileMatchFound%" echo ****** Mask match found: %~2&&Set fileMatchFound=TRUE
:: echo del %~1%~3 <-- delete the found file here..
goto :EOF