CMD
1 echo %%a|findstr /r "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9A-Z][0-9][0-9][0-9][0-9][0-9].+.pdf"
2または、
3 echo %%a|findstr /r "^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9A-Z][0-9][0-9][0-9][0-9][0-9].+.pdf$"
でしょうか。
なお、後者は、正規表現に「文字列先頭の^」や「文字列末尾の$」を追加していますが、バッチのechoは前後の空白も出力するので、echo %%a | findstr ~と%%aの後(|の前)に空白を入れてしまうと、echoで出力されるのは「ファイル名の%%a」ではなくて、「ファイル名の%%aとその後に空白1つ」になるので、末尾はpdfじゃなくてpdf空白となり、正規表現pdf$にマッチしませんので、ご注意ください。echo %%aと%%aの前に2つ以上の空白を入れた場合も同様です。
set aa = 123のように、入れちゃ駄目な空白を入れたがる人がいるので、念のための注意です。
「つい空白を書いちゃう人」が今後バッチファイルを勝手に修正してしまうリスクを考えると、正規表現を、"^ *[0-9]~~~~.pdf *$"と前後に空白があってもなくても良いように書く手もあります。
追記
findstrの検索文字列に長さ制限があるとは知りませんでした。
CMD
1for %%a in (*.pdf) do (
2 rem _ で分割して、第1カラムと第2カラムをサブルーチンに渡してチェック
3 for /f "delims=_ tokens=1-2" %%A in ("%%a") do call :CHECK "%%A" "%%B"
4 if errorlevel 1 (
5 move %%a %ERROR_PATH%
6 ) else (
7 move %%a %OUTPUT_PATH%
8 )
9)
10exit /b
11
12:CHECK
13rem 第1カラムが所定書式じゃないと ERRORLEVEL を 1 でリターン
14echo %~1|findstr /r "^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$"||exit /b 1
15rem 第2カラムが所定書式じゃないと ERRORLEVEL を 1 でリターン
16echo %~2|findstr /r "^[0-9][0-9][0-9][0-9][0-9A-Z][0-9][0-9][0-9][0-9][0-9]$"||exit /b 1
17rem ERRORLEVEL を 0 でリターン
18exit /b 0
最初の回答に書いた、
「つい空白を書いちゃう人」が今後バッチファイルを勝手に修正してしまうリスク
を考慮すると、
echo "#%~1#" | findstr /r "#[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]#"||exit /b 1
とかが良いかもしれません。#はファイル名に絶対に含まれない文字。
あと、最初回答を書いた時には気づきませんでしたが、move %%~na ~~の%%~naは「拡張子を除いたファイル名」なので、moveは失敗すると思います。上記では%%aに書き換えてます。
2024/07/15 02:33
2024/07/15 03:13
2024/07/15 05:12