システムメンテナンスのお知らせ

VBScriptのバッチでの作成を考えています。

あるフォルダ(名をFolderとします)の中に、たくさんのサブフォルダが
あって、そこにあるファイルをすべてFolderに移動させたいと
思っています。
(ファイルはjpg画像ファイルだけです。)

たとえば、Folderの下に、Folder_Bというサブフォルダがあって、
更にその下にFolder_Cがあり、その中には1.jpgというファイルが
あったとしたら、バッチ実行後、Folderの直下に1.jpgがあり、
(可能であれば)フォルダはすべて消えているという具合です。

ファイルの移動自体はファイルシステムオブジェクトのFile.Moveで行い、
最後にディレクトリを列挙して削除していけばいいんだろうなという
ところはわかります。
しかし、フォルダをサブフォルダも含めてすべて舐めて、そこから
ファイルを移動していくというロジックに悩んでいます。

アドバイスいただけないでしょうか。

gooドクター

A 回答 (2件)

この手のコードは 「FileSystemObject 再帰」 のキーワードでググればたくさんサンプルが見つかる。



Excel VBA の標準モジュールなどでステップ実行すると動きを確認できる。
ロジックとしては、、、
サブフォルダーが存在しなくなる最深フォルダーまで潜る。
そのフォルダーにあるファイル群を移動させる。
1階層上のフォルダーに戻る。
先ほどのフォルダーを削除する。
ってのを再帰処理で行う。

Const rootPath = "E:\test\"
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
Dim rootDir
Set rootDir = fso.GetFolder(rootPath)

Call MoveFiles(rootDir)


' 引数としてフォルダー オブジェクトをもらう
Sub MoveFiles(aDir)
  ' 引数で得たフォルダー内にサブフォルダーがあれば再帰する。
  Dim subDir
  For Each subDir In aDir.SubFolders
    Call MoveFiles(subDir) ' サブフォルダーで再帰処理
    subDir.Delete ' 戻ってきたら (フォルダー内が空であるはずなので) フォルダーを削除する
  Next

  ' 引数で得たフォルダー内のファイル群を移動させる。
  Dim f
  For Each f In adir.Files
    f.Move(rootPath)
  Next
End Sub
    • good
    • 2

VBSでは無いですが、BATファイルなら↓これで


for /r C:\Folder %%F in (*) do move "%%F" C:\Folder
    • good
    • 3

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング