質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

1回答

278閲覧

バッチ処理でファイル名を検索、判定する方法について

taka0920

総合スコア3

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2024/07/15 00:56

編集2024/07/15 01:32

お世話になっております。
現在バッチ処理で特定のフォルダにあるファイル名を検索してその結果によって別フォルダに移動するという処理を作製しようとしています。
動作環境はWindows11です。

具体的なやりたいこととしては、111111111_2222222222_3333_44444444_555555.pdfのような形式のファイル名のファイルがあり、111111111部分の桁数が9桁、2222222222部分の桁数が10桁なら別フォルダに移動をさせたいです。

現在考えている方針としては、ファイル名を以下のように正規表現で検索して判定をしたいと考えています。
なのですが、findstrだとファイル内の文字列しか検索できず、ファイル名の検索ができないようです。

set OUTPUT_PATH=D:\判定OKフォルダ set ERROR_PATH=D:\判定NGフォルダ rem フォルダ内のファイル全件検索 for %%a in (*.pdf) do ( rem 正規表現でファイルの形式チェック 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" rem 判定、ファイル移動処理 if errorlevel 1 ( move %%~na %ERROR_PATH% ) else ( move %%~na %OUTPUT_PATH% ) )

この場合、findstrでは実現ができないのでしょうか。
バッチ処理にお詳しい方、実現方法別なやり方等ご教示ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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 01:39

編集2024/07/15 03:31
otn

総合スコア85458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taka0920

2024/07/15 02:33

早速のご返答ありがとうございます。 ご教示いただいた通りに試してみましたが、「検索文字列が長すぎます」のエラーになりました。 検索文字列の長さ制限があるようなので、「_」でファイル名を区切ってその文字列の長さを判定する等のやり方に変更したほうがよいのかなと検討中です。
otn

2024/07/15 03:13

なるほど。実際に、お書きの長さの文字列でfindstrを実行してみるところまではやってませんでした。 とりあえず、別案を追記しておきます。
taka0920

2024/07/15 05:12

追記までいただきありがとうございました。 期待していた動きとなりました。 作りたい処理はこれで全部ではないのですが、教えていただいた内容を元に後続処理の作成を進めてみます。 とても助かりました!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問