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

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

新規登録して質問してみよう
ただいま回答率
85.50%
バッチファイル

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

Q&A

解決済

3回答

2787閲覧

バッチファイルでフォルダに保存された大量の画像ファイルを整理したい。

dai3922

総合スコア34

バッチファイル

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

0グッド

0クリップ

投稿2018/09/19 10:53

あるフォルダに保存されている大量(10万件を超える)の画像ファイルを整理したいです。
出来ればバッチファイルで組めればと考えています。

=フォルダ構成=
「フォルダA」「フォルダB」「フォルダC」…(30件ほどのフォルダがあります)
それぞれのフォルダの直下に「test20180903083503.jpg」などの画像ファイルが存在しています。
ファイル数は数千~数十万件です。

=画像ファイル形式=
例:test20180903083503.jpg
先頭の「test」、拡張子の「.jpg」は固定です。
ご覧の通りtestの後は日付となっているためファイル名称は固定長です。

=やりたいこと=
0. 「フォルダA」など各フォルダの中に存在している画像ファイルを、ファイル名称から自動で作成したサブフォルダに格納していきたいです。
0. サブフォルダは「フォルダA」⇒「yyyy」⇒「0m」⇒「0d」という形で、例題の「test20180903083503.jpg」であれば「フォルダA」⇒「2018」⇒「09」⇒「03」に格納したいと考えています。
0. 定期的に発生する作業のため、「フォルダA」の直下に存在する画像ファイルからサブフォルダの作成と画像ファイルの移動を自動化したいです。
これを「フォルダA」「フォルダB」「フォルダC」…それぞれで行いたいと考えています。

=備考=

  • 「フォルダA」「フォルダB」「フォルダC」が格納されている親ディレクトリで実行できれば大変嬉しいですが、フォルダ毎に手動実行で問題ありません。
  • CSV形式ですが、「フォルダA」などのフォルダ名となる文字列が行ごとに格納されたテキストファイルは存在しています。
  • もちろん、前項のCSVファイルを使用する必要はありません。

=試行=
以下の内容で試してみましたが目的の動作が出来ませんでした。

@Echo off rem カレントディレクトリを移動 cd /d %~dp0 rem 遅延環境変数に対応 setlocal ENABLEDELAYEDEXPANSION rem サーバIPアドレス設定 set srv_IP=192.168.1.105 rem 設定ファイルダウンロード元取得 for /f "tokens=1,* skip=1 delims==" %%a IN (\%srv_IP%\設定ファイル.ini) do ( set %%a=%%b ) rem フォルダー名称をCSVファイルから取得 for /f "delims=, tokens=5" %%a in (%FolderName%) do ( rem 移動元フォルダに存在している画像ファイル名称を取得 for /r %FolderPath%\%%a %%i in (test*.jpg) do ( set filename=%%~ni rem 画像ファイル移動処理 robocopy %FolderPath%\%%a %FolderPath%\%%a\!filename:~4,4!\!filename:~8,2!\!filename:~10,2! /s /mov /r:1 /w:1 ) )

=動作結果=
以上の内容を実施すると、robocopyコマンドの部分で最初に読み込んだ「test20180903083503.jpg」で作成した「フォルダA」⇒「2018」⇒「09」⇒「13」へ「test20180903083503.jpg」が移動するのは良いものの、続く「test20180904120000.jpg」も同様のフォルダに移動してしまいます。
目論見としては「test20180904120000.jpg」は「2018」⇒「09」⇒「04」に移動して欲しいです。

少しVBの想像があったのですが、バッチファイルでは変数が更新されることなくforの中のrobocopyコマンドで移動元から移動先への処理が最後まで進んでしまうとのことでした。
上記、どうか教えて頂けますでしょうか?

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

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

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

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

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

tonkun4os

2018/09/19 11:51

同じような処理昔rubyで組みましたなー、batchでは機能的に難しいと思いますがー
dai3922

2018/09/20 10:21

早速回答頂きありがとうございます。rubyは全く触れたことがないですが、機会があれば挑戦してみます。
guest

回答3

0

ベストアンサー

robocopyの使い方の問題と思われます。
robocopyの第三パラメーターにファイルを指定していないので、フォルダ内を丸ごと移動してしまっているような気がします。
あと/sオプションも不要かと。少なくとも下記サンプルではあるとダメでした。

下記はカレントフォルダにあるファイルを対象に行った例です。

BAT

1@Echo off 2setlocal ENABLEDELAYEDEXPANSION 3 4rem フォルダー名称をCSVファイルから取得 5for %%i in (test*.jpg) do ( 6 set filename=%%~ni 7 robocopy . .\!filename:~4,4!\!filename:~8,2!\!filename:~10,2! %%i /mov /r:1 /w:1 8) 9

投稿2018/09/20 02:10

ttyp03

総合スコア16996

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

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

dai3922

2018/09/20 10:22

早速回答頂きありがとうございます。 アドバイス頂きましたこと、追って確認してみます。 来週中頃の確認となってしまい申し訳ありませんが、またご報告します。
dai3922

2018/10/02 09:22 編集

アドバイス頂きましたおかげで以下の内容にて要望通りのことが出来ました。 ご指摘の通り、パラメータ不足でフォルダをそのまま移動していました。 お恥ずかしい… ```bat @Echo off setlocal ENABLEDELAYEDEXPANSION rem ファイル一覧リストを取得 for /f "delims=, tokens=5" %%A in (ファイル一覧リスト.txt) do ( pushd %old_path%\%%A for %%i in (test*.jpg) do ( set filename=%%~ni robocopy %old_path%\%%A %new_patho%\%%A\!filename:~4,4!\!filename:~8,2!\!filename:~10,2! %%i /mov /r:1 /w:1 ) ) ``` otn様に教えて頂いたpushdコマンドが活用しきれていない気がしますが、試行錯誤の末、上記で出来ましたので修正は後回しで取り急ぎ報告致します。 本当に助かりました。 皆様、どうもありがとうございました。
guest

0

アドバイス頂きましたおかげで以下の内容にて要望通りのことが出来ました。
ご指摘の通り、パラメータ不足でフォルダをそのまま移動していました。
お恥ずかしい…

bat

1@Echo off 2setlocal ENABLEDELAYEDEXPANSION 3 4rem ファイル一覧リストを取得 5for /f "delims=, tokens=5" %%A in (ファイル一覧リスト.txt) do ( 6 pushd %old_path%\%%A 7 for %%i in (test*.jpg) do ( 8 set filename=%%~ni 9 robocopy %old_path%\%%A %new_patho%\%%A\!filename:~4,4!\!filename:~8,2!\!filename:~10,2! %%i /mov /r:1 /w:1 10 ) 11)

otn様に教えて頂いたpushdコマンドが活用しきれていない気がしますが、試行錯誤の末、上記で出来ましたので修正は後回しで取り急ぎ報告致します。

本当に助かりました。
皆様、どうもありがとうございました。

投稿2018/10/02 09:22

dai3922

総合スコア34

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

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

0

CMD

1for /f %%A in (フォルダ一覧ファイル.txt) do ( 2 pushd %%A 3 for %%B in (test*.jpg) do call :move %%B 4 popd 5) 6goto :EOF 7 8:move 9set B=%1 10set B=%B:test=% 11set YYYY=%B:~0,4% 12set MM=%B:~5,2% 13set DD=%B:~7,2% 14if not exist %YYYY% md %YYYY% 15if not exist %YYYY%\%MM% md %YYYY%\%MM% 16if not exist %YYYY%\%MM%\%DD%md %YYYY%\%MM%\%DD% 17move %1 %YYYY%\%MM%\%DD% 18goto :EOF

投稿2018/09/19 12:42

編集2018/09/20 02:32
otn

総合スコア84423

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

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

dai3922

2018/09/20 10:23

早速回答頂きありがとうございます。 来週中頃になってしまいますが、頂きました内容で試してみます。 追ってご報告致します。
dai3922

2018/10/02 09:15 編集

無事にできました! 詳細に記載頂いてどうもありがとうございます。 特にフォルダ一覧ファイルを活用すること、「pushd」コマンドなどとても参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問