findstr
が期待どおりに動作しない理由がわかりません。
テストディレクトリに次のファイルがあります。
aaa.jpg
bbb.png
ccc.svg
aaa_s.jpg
bbb_s.png
ccc_s.svg
aaa_small.jpg
bbb_small.png
ccc_small.svg
また、cmd.exeに直接渡す次の行があります。
for /f "delims=" %f in ('dir /b /a:-d ^| findstr /ile "gif jpg png svg" ^| findstr /ie "_s.*"') do echo "%f"
私の意見では、次のファイルと一致する必要があります。
aaa_s.jpg
bbb_s.png
ccc_s.svg
しかし、実際には一致しています
aaa_s.jpg
bbb_s.png
ccc_s.svg
aaa_small.jpg
bbb_small.png
ccc_small.svg
はい、問題はドットが文字どおりに扱われるのではなく、「任意の文字」として機能することです。
findstr /ie "_s.*"
ボットはどうすればそれをエスケープできますか?バックスラッシュを使用する、つまり次のように変更する
findstr /ie "_s\.*"
動作しません。
.
をエスケープして、リテラル.
文字に一致させるにはどうすればよいですか?\
を使用して正しい方向に進んでいますが、残りの文字を見つけるには、追加の.
が必要です。
findstr /ie "_s\..*"
例(タイプとcmd
シェル):
F:\test>dir /b /a:-d | findstr /ile "gif jpg png svg" | findstr /ie "_s.*"
aaa_s.jpg
bbb_s.jpg
ccc_s.jpg
aaa_small.jpg
bbb_small.jpg
ccc_small.jpg
F:\test>dir /b /a:-d | findstr /ile "gif jpg png svg" | findstr /ie "_s\..*"
aaa_s.jpg
bbb_s.jpg
ccc_s.jpg
したがって、バッチファイルには次のものが含まれている必要があります。
for /f "delims=" %f in ('dir /b /a:-d ^| findstr /ile "gif jpg png svg" ^| findstr /ie "_s\..*"') do echo "%f"
この特定のタスクでは、"."
findstr
の場合、置き換えた場合は使用しません。
dir /b /a:-d
→where .:*_s.*
findstr /ie "_s\.*"
→findstr /ei "gif jpg png svg"
where .:*_s.*|findstr /ei "gif jpg png svg"
for /f delims^= %f in ('where .:*_s.*^|findstr /ei "gif jpg png svg"')do echo "%~nxf"