回答編集履歴

1

別案追記

2024/07/15 03:31

投稿

otn
otn

スコア85507

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