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

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

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

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

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

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

Q&A

解決済

1回答

2296閲覧

フォルダー名の変更の際、同名ファイルがある際にそれを統合して行う方法

sarinaga

総合スコア7

Windows

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

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

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

0グッド

0クリップ

投稿2021/06/06 02:25

編集2021/06/06 04:54

前提・実現したいこと

エクスプローラーのフォルダー名変更でフォルダーの統合を行うかどうかの確認ダイアログ

上記のように「フォルダー名を変更する際に同じフォルダー名があった時にそれを統合してくれる」機能がある、ファイル名一括変更ソフトウェアを探しています。

まず、そういうソフトウェアがあったら教えていただけますでしょうか?あればそれを教えていただければ質問は終了で構いません。

で、今のところそのようなソフトウェアを私は見つけられていないので、コマンドプロンプトかPowerShellで同等のことを実現しようと考えています。理想は以下の通りです。

E:\temp>tree /f フォルダー パスの一覧: ボリューム TTT ボリューム シリアル番号は ????-???? です E:. ├─fromわはは │ ほほほ.mp4 │ ├─fromえへへ │ ぐぬぬ.mp4 │ ├─toわはは │ うふふ.mp4 │ └─toえへへ はわわ.mp4
rem 作るバッチコマンドの実行例 newren from* to*
E:\temp>tree /f フォルダー パスの一覧: ボリューム TTT ボリューム シリアル番号は ????-???? です E:. ├─toわはは │ ほほほ.mp4 │ うふふ.mp4 │ └─toえへへ ぐぬぬ.mp4 はわわ.mp4

上記のような動作は既存のrenコマンドでは実現できないものになります。

試したこと

フォルダーひとつずつは以下でいけることは分かっています。

E:\temp>move fromわはは* toわはは fromわはは\ほほほ.mp4 1 個のファイルを移動しました。 E:\temp>rmdir /s /q fromわはは E:\temp>

しかし「フォルダー名を大量に、ワイルドカードとか、置換機能を使って直したい」となるとファイル名一括変換ツールかなと。次善策がバッチやpowershellの利用となるところです。bashなら簡単だよという話があればそれでもかまいません。

よろしくお願いします。

試したこと(その2)

どちらかというと、フォルダ名が重複したときにそれを統合してくれるファイル名一括変換ソフトを探すのが目的だったのにどうしてこうなった。

以下は私が作ったバッチファイルですが、まあ、このくらいなら書けるのです・・・・。
まあ、内容としては不完全でしてnewren hoge* hogeとしたときに以下のようには処理をしてはくれません。

hoge -> hoge hoge1 -> hoge hoge2 -> hoge hoge3 -> hoge hoge4 -> hoge
@echo off echo. rem %1=処理対象ディレクトリ rem %2=置換する文字 rem %3=置換された後の文字 if "%2"=="" ( echo 引数は2つ必要です. echo. echo newren [作業対象ディレクトリ] [置換前文字列] ^([置換後文字列]^) echo 置換後文字列が省略されたときは, 置換前文字列を消去します. echo. exit /b 1 ) set base=%1 set before=%2 set after=%3 echo 作業対象ディレクトリ: %base% echo 置換前文字列: %before% echo 置換後文字列: %after% echo. set flag=0 set exists=0 setlocal enabledelayedexpansion for /d %%a in (%base%*%before%*) do ( set from=%%a set to=!from:%before%=%after%! if !flag!==0 ( echo 以下のようにフォルダ名が置換されます. echo 変更前ディレクトリ: !from! echo 変更後ディレクトリ: !to! echo 中止する場合はCTRL+C pause set flag==1 ) echo フォルダ名変更: !from! -^> !to! If not exist !to! mkdir !to! > NUL move !from!* !to! > NUL if %errorlevel%==0 rmdir /s /q !from! > NUL set exists=1 ) if !exists!==0 ( echo フォルダは1つもありません. ) endlocal echo.

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

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

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

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

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

itagagaki

2021/06/06 02:56

リネームの規則とか、引数がフォルダじゃなくファイルだった場合はどうするかとか、実装にあたって詳細を煮詰めるべきことがいろいろあるので、なかなかさっと回答しにくい質問かなと思います。 まずはご自分で思うようにやってみて、どうしてもうまくいかないことが出てきたら、その点について具体的に質問されてはいかがでしょうか。
sarinaga

2021/06/06 04:09

これ以上仕様を詰めるようなことありますでしょうか?for exampleは十分に説明していると思うのですが。足りていないのは「変更後のフォルダー名がファイル名と競合した時は、処理しない」くらいしか思いつきません。
gentaro

2021/06/06 04:27

「リネーム」て思ってるから難しいだけじゃないの。 「移動」だったら同名のものが存在する場合に上書きするか否かだけでしょ。
itagagaki

2021/06/06 04:50

sarinagaさん、ならばやってみれば良いのでは?何がお困りなのかわかりません。
guest

回答1

0

ベストアンサー

お書きのコードの仕様で、中身のファイル名、ディレクトリー名の重複をちゃんと処理すると、こうでしょうか。飾り的部分は除いています。

CMD

1@echo off 2setlocal enabledelayedexpansion 3set base=%1 4set before=%2 5set after=%3 6 7pushd %base% 8for /d %%a in (*%before%*) do ( 9 set from=%%a 10 set to=!from:%before%=%after%! 11 12 echo フォルダ名変更: !from! -^> !to! 13 If not exist !to! ( 14 ren !from! !to" 15 ) else ( 16 for /f %%b in ('dir /a/b !from!') do call :MOVE %%b 17 rmdir !from! || echo まだ何か !from! に残っている 18 ) 19) 20exit /b 21 22rem 名前の重複があったら拡張子の前に _ を追加して移動 23:MOVE 24set B=%~n1 25:LOOP 26if exist !to!\%B%%~x1 set B=%B%_&goto LOOP 27move !from!\%1 !to!\%B%%~x1 >NUL 28exit /b

newren hoge* hoge

を仕様にするなら、

CMD

1@echo off 2set base=%~dp1 3set before=%1 4:L 5set x=%before% 6set before=%x:*\=% 7if not "%x%" == "%before%" goto L 8set to=%2 9 10pushd %base% 11for /d %%a in (%before%) do ( 12 if not %%a == !to! ( 13 set from=%%a 14 15以下同様。 上記ifの閉じ括弧だけ追加

でしょうか。
set before=%~nx1で良いかと思ったけど存在するファイル名の場合、*が消えてしまう。

投稿2021/06/06 07:46

otn

総合スコア84533

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

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

sarinaga

2021/06/07 11:06

ありがとうございます。参考にして少しでも自身の目的に叶うようなバッチにしていこうと思います。 今更にして思うことですが、powershellで書いたほうがよかったかな・・・・後悔。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問