- ベストアンサー
フォルダーの移動と削除のプログラムを作成する方法
- フォルダーを上の階層に移動するプログラムを作成し、元のフォルダーを削除する方法を教えてください。
- ターゲットフォルダーの名前を変えずに、そのフォルダーを上の階層に移動する方法を知りたいです。
- ファイル整理中に多くのターゲットフォルダーを一括で処理するためのバッチやスクリプトの作成方法について教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
@echo off for %%A in (%*) do ( cd /d "%%~A" for /d %%B in (*) do ( if exist "..\%%~nxB" ( if exist "..\%%~nxB_" ( if exist "..\%%~nxB__" ( echo フォルダ名が _ を2つ付けても重複 "%%~nxB" ) else ( move "%%~B" "..\%%~nxB__" ) ) else ( move "%%~B" "..\%%~nxB_" ) ) else ( move "%%~B" .. ) ) cd .. rd "%%~A" ) pause でどうですか? ファイル名やフォルダー名に空白は入れない方が良いですよ。
その他の回答 (4)
- notnot
- ベストアンサー率47% (4900/10358)
1) は再現しません。こちらでは上手く行きます。 パスに空白は含まれないだろうと思って、手を抜いていますが、もしかして空白が含まれますか? 2)これはフォルダー名が重複するので、無理ですね。 あらかじめname_1をリネームしておく必要があります。
補足
>パスに空白は含まれないだろうと思って、手を抜いていますが、もしかして空白が含まれますか? はい。 『S:\test\Name_1\Name 2』のように空白(半角)を含んだフォルダーが殆どです。 『Name 2 part 2』 のように複数の空白(半角)があるフォルダーもあります。 Name 2をName_2のように空白のない場合はうまく処理できました。 >2)これはフォルダー名が重複するので、無理ですね。 >あらかじめname_1をリネームしておく必要があります。 フォルダー名が重複するも少なからずあります。 この場合、 下位のフォルダー名を『Name 1』を『Name 1_』のように名前の最後に『_』アンダーバーを付加した フォルダー名に変名後に処理するようにBATを改造できませんか ? フォルダー名に空白がある場合もBAT改造に反映をお願いします。 ----------------------- ドラッグ&ドロップしたフォルダ名に「Unicode文字」が存在する場合も問題が出ますか ?
- notnot
- ベストアンサー率47% (4900/10358)
@echo off for %%A in (%*) do ( cd /d %%A for /d %%B in (*) do ( if exist ..\%%~nxB ( echo フォルダー名重複 "%%~dpnxB" ) else ( move %%B .. ) ) cd .. rd %%A ) pause かな。
お礼
引き続き、BATの修正ファイルをいただきありがとうございます。 いただいたBATをテストしてみました。 例えばエキスプローラーで 1)『S:\test\Name_1\Name_2』で S:\test\Name_1をターゲットフォルダーとして デスクトップに作成したBATにドラッグ&ドロップしましたが コマンドの構文が誤っています。 ディレクトリーが空ではありません。 とエラーが発生します。 2)『S:\test\Name_1\Name_1』では、 S:\test\Name_1をターゲットフォルダーとして デスクトップに作成したBATにドラッグ&ドロップしましたが フォルダー名重複 ディレクトリーが空ではありません。 とエラーが発生します。 同じフォルダー名が上位、下位にある場合も存在するのですが このような場合も想定する必要が出ました。 ----------------------- 『ディレクトリーが空ではありません。』は、 移動処理がうまく処理されずにエラーになる事が原因だ思います。 エラーが出る原因を修正できますか ?
- kteds
- ベストアンサー率42% (1882/4440)
プログラムを組むまでもなく、2つのコマンド move ,rmdirで可能です。 1) D:\ABC\XYZ\GGG move D:\ABC\XYZ\GGG D:\ABC rmdir D:\ABC\XYZ 2) D:\ABC\FGG move D:\ABC\FGG D:\ rmdir D:\ABC
補足
ありがとうございます。 現在ファイル整理中でターゲットフォルダーが多数あるので コマンドをOne_By_Oneで処理していては手数が掛かって効率が悪くなります。
- notnot
- ベストアンサー率47% (4900/10358)
バッチファイルでドラッグドロップしてください。 @echo off for %%A in (%*) do ( if exist "%%~dpA..\%%~nxA" ( echo フォルダー名重複 "%%~A" ) else ( move %%A "%%~dpA.." ) ) pause
お礼
ありがとうございます。 検証して確かに移動できることを確認しました。 少し思っていた作動とは違ったのでBATを修正いただけると嬉しいです。 条件は下記で最初と同じとして 1) D:\ABC\XYZ\GGG 2) D:\ABC\FGG 1)の場合で現在のBATでは、 GGGをターゲットでドラッグドロップしないと移動できません。 XYZをターゲットでドラッグドロップしてGGGを移動したいのです。 現在のBATで、XYZをターゲットにすると ABCにXYZ\GGGが移動してしまいます。 2)の場合も同様に現在のBATでは、 FGGではなくABCをドラッグドロップしてFGGを移動したいのです。 現在のBATでABCターゲットにすると D:にGGGが移動してしまいます。 また、移動後のフォルダーは空になるので削除したいので削除処理も追加したいです。
お礼
修正されたBATファイル ありがとうございます。 サンプル数が少なく、ターゲットのファイルを全てテストしたわけではありませんが 約50個ほどテストした結果、45個は問題なく処理できました。 5個ほどエラーで処理できませんが原因は、 多分フォルダー名の単語数が長さが長いので処理できなかったものと思われます。 処理できなかったターゲット数が少ないので出来ないディレクトリーは手動で処理しました。 十分に機能するBATを頂き感謝致します。 最後までお付き合い願いありがとうございます。