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

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

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

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

Q&A

解決済

1回答

3352閲覧

移動先に重複ファイルがある場合移動元ファイルをリネームしたい

ya0501

総合スコア27

バッチファイル

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

0グッド

0クリップ

投稿2018/12/23 09:57

バッチファイルで、サブディレクトリの2階層以下にあるファイルを
1階層直下に移動させるというバッチのコードを作成しました。

SETLOCAL enabledelayedexpansion cd C:\Users\Desktop\Test for /d %%i in (*) do ( cd %%i for /r . %%j in (*) do ( move "%%j" ) cd .. )

上記の記述の環境ではTestディレクトリ配下に数100のサブディレクトリ(A,B,Cとする)が
あり、それぞれのサブディレクトリ中にも複数のサブディレクトリ(D,E,Fとする)が
あります。
実行例は以下です。

========例========
◎実行前
C:\Users\Desktop\Test
|
|----A---D---1234.txt
|
|----B---E---5678.xls
|
|----C---F---9012.pdf

◎実行後
C:\Users\Desktop\Test
|
|----A---1234.txt---D
|
|----B---5678.xls---E
|
|----C---9012.pdf---F

D、E、FにあったファイルをA、B、C直下に移動させることは出来たのですが、
この場合実行前からAフォルダに1234.txtがある場合上書きを確認されます。

●回答希望事項
上書きはさせたくなく、可能なら同名ファイルはある分リネーム「_1とか(1)」をするように
動作させたいと考えております。
良い記述がみつからず困っております。
どうかお知恵をおかしください。

よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

move "%%j"

第2引数に「..」を書いているんですよね?

とりあえず、<どこかフォルダー>にあるファイルを親フォルダーに移動する汚いサンプルコードを置いておきます。対象のパス名にスペースなどが入っている場合や、その他エラーの考慮は一切していません。

提示されたコードの%%iのループに相当する部分はあえて書いていません。

bat

1@echo off 2setlocal enabledelayedexpansion 3 4rem カレントフォルダーを移動前のファイルがある<どこかのフォルダー>へ変更 5pushd <どこかのフォルダー> 6 7rem ファイル毎のループ 8for /r . %%j in (*) do ( 9 rem リネーム移動のサブルーチン呼び出し 10 call :renmove %%j .. 11) 12 13rem カレントフォルダーを実行前の場所に戻す 14popd 15 16rem これより後ろはサブルーチンなのでバッチ処理を終了 17exit /b 18 19rem ファイルを移動するサブルーチン 20rem 引数:<移動元のファイル> <移動先フォルダー> 21:renmove 22 rem 連番の初期値 23 set num=0 24 rem 移動先のファイルパス 25 set distfile=%2\%~nx1 26 27rem 移動可能なファイル名が見つかるまでループ 28:renmove_loop 29 rem 移動先に同名のファイルがあるか 30 if exist !distfile! ( 31 rem 連番を更新(初回は0+1)して、移動先のファイルパスを再構成 32 set /a num=num + 1 33 set distfile=%2\%~n1_!num!%~x1 34 rem 再判定のためループ 35 goto :renmove_loop 36 ) 37 rem moveコマンドは移動先のファイル名を指定すればリネームできる 38 move %1 !distfile! 39exit /b

p.s. サラ書きのはずが、forループ中のgotoの罠の存在を忘れていて悩んでしまった…。

投稿2019/01/16 16:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問