回答編集履歴
1
別案追記
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`に書き換えてます。
|