次の操作を試みることができる:
@echo off
setlocal enabledelayedexpansion
set "source=c:\sessions"
set "output=noBARs.txt"
set "find=*foo"
set "repl=bar*"
1>"%output%" (
for %%e in ("%source%\%find%") do (
set "file=%%e"
if not exist "!file:~0,-3!%repl%" (
echo %%~ne
)
)
)
これは彼らのファイル名内*foo
を含むすべてのファイルを反復処理します。次に、ファイル名の最後の3文字をbar*
に置き換えて、ファイルの存在をチェックします。対応するbar
ファイルが存在しない場合は、元のファイル名を出力ファイルnoBARs.txt
に書き出します。
私は彼が、数値定数が続きFOO
で終わるファイルが同様にテストされるべきであると述べているdEEkAyの最後のコメントに基づいて、スクリプトの代替バージョンを追加しました。私はまだdEEkAyの正確な意図が何であるかはまだ分かりませんが、*FOO*
というファイル名は*FOO
と同じに扱われると仮定しています。
次の入力:
Blabla-1111-FOO
Blabla-1111-BAR1
Bleble-2222-FOO
Bleble-2222-BAR1
Bleble-2222-BAR5
Blublu-3333-FOO6
Blublu-3333-BAR1
Blublu-5678-FOO
Blublu-5678-FOO1
Blublu-5678-BAR2
Blublu-5678-BAR4
Bleble-6666-FOO
Bloblo-7777-FOO5
Bloblo-7777-BAR8
Bloblo-9999-FOO
Blublu-9999-FOO9
Bloblo-!^^!-FOO
は、次のような出力を生成します:
Bleble-6666-FOO
Bloblo-!^^!-FOO
Bloblo-9999-FOO
Blublu-9999-FOO9
スクリプトの代替バージョンは、オリジナルよりも堅牢です。感嘆符とキャレットが適切に含まれるファイル名とパスを適切に処理できるようになりました。残念ながら、それにはコストがかかります。 forループの反復ごとに実行されるcall
コマンドのため、スクリプトはかなり遅くなりました。おそらく、よりバッチファイルのスクリプティング経験を持つ人が、より良い解決策を考え出すことができます。
@echo off
setlocal disabledelayedexpansion
set "source=c:\sessions"
set "output=noBARs.txt"
set "find=foo"
set "repl=bar"
1>"%output%" (
for %%e in ("%source%\*%find%*") do (
set "path=%%~dpe"
set "file=%%~ne"
setlocal enabledelayedexpansion
call :ReplaceEndOfString file match "%find%" "%repl%"
if not exist "!path!!match!*" (
echo !file!
)
endlocal
)
)
exit /b
:ReplaceEndOfString (__in *source, __out *dest, __in find, __in repl) {
set "temp=!%1:*%~3=%~3!"
set "%2=!%1:%temp%=%~4!"
exit /b
}
は"%source%\*%find%?"
が唯一のものかもしれない、一つの任意の文字を含む%find%
で終わるファイル名に一致するのに対し、"%source%\*%find%*"
は、そのファイル名内の%find%
を含むすべてのファイルが一致することに注意してください。
ありがとう、私の友人。あなたは私に多くの面倒を救った。あなたのソリューションは完璧に動作します。私はその部分を-3!%match%の隣に置かなければなりませんでした。なぜなら、私の実際の問題では、やや異なる名前になってしまいました。 このバッチを実行するたびに追加する代わりに、出力ファイルを上書きする方法はありますか? – dEEkAy
私のコメントはもう編集できないようです。 del ... txt – dEEkAy
@dEEkAy私はそれに応じてスクリプトを変更しました。実行されるたびに、出力ファイルが上書きされます。また、ソースディレクトリにたくさんのファイルが含まれている場合は、より高速になります。それがあなたの問題を解決するのに役立っていれば、私の投稿を回答としてマークしてください。 – treintje