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