※当サイトは、アフィリエイト広告を利用しています。

プチIT化

【VBS】フォルダ・サブフォルダ内のファイルのみを別フォルダにコピーする

こんにちは、わたあめです。VBScriptでファイルコピーを行うスクリプトは載っていることが多いのですが、サブフォルダ内のファイルも、ファイルだけ一緒にコピーというスクリプトはなかなか見つからなかったので、作成してみました。

自分用に作成したスクリプトです、参考までにお願いします。実行等は自己責任でお願いします。

フォルダ・サブフォルダ内のファイルをコピーするスクリプト概要

今回作成したスクリプトの内容をまとめると以下です。

  • 指定したフォルダ内のファイルを全てコピー
  • 指定したフォルダ内のサブフォルダ内にあるファイルも全てコピー
  • サブフォルダ自体はコピーせずに、サブフォルダ内のファイルをコピー
  • サブフォルダ内のサブフォルダの処理は実施しない

つまり、スクリプトを動かした結果、スクリプトを実行すると、指定したフォルダ内のファイルもサブフォルダ内のファイルも移動先のフォルダの同じ階層に存在するようになります。

まずは基本スクリプト:フォルダ内のファイルをコピー

サブフォルダ内の処理は置いておいて、まずはフォルダ内のファイルを別フォルダにコピーする基本スクリプトサンプルを載せておきます。

以下スクリプト内で変更すべきところは、「srcFolder」にコピー元、「dstFolder」にコピー先と、変数にフォルダパスを指定します。

' 変数定義
Dim srcFolder ' コピー元ファイルパス
Dim dstFolder ' コピー先フォルダパス
Dim objFL ' フォルダ用オブジェクト
Dim objSubFL ' サブフォルダー用オブジェクト
Dim objFile ' ファイル用オブジェクト

' フォルダパス定義 ★ここを変更
srcFolder = "C:\Users\*****\Desktop\テスト1"
dstFolder = "C:\Users\*****\Desktop\テスト2"

'ファイルシステムオブジェクト定義
Set objFS = CreateObject("Scripting.FileSystemObject")

' フォルダ取得
Set objFL = objFS.GetFolder(srcFolder)

' フォルダ内のファイル毎に、コピー
For Each objFile in objFL.Files
  ' ファイルコピー実行(ファイルあれば上書きする)
  objFS.CopyFile objFile.Path, dstFolder & "\" & objFile.Name, True
Next

' ファイルオブジェクト解放
Set objFile = Nothing
Set objFL = Nothing
Set objFS = Nothing

デスクトップ上にある"テスト1"フォルダのファイルを"テスト2"フォルダの直下にファイルコピーしています。

わたあめ
わたあめ
これが基本のファイルコピースクリプトです。この構文をフォルダ内にあるサブフォルダでも同じことを行う繰り返しを入れていきます!

サブフォルダ内のファイルもコピーするスクリプト

指定したフォルダ内のファイルと、指定したフォルダ内に存在するサブフォルダないのファイルをコピーするスクリプトサンプルです。

' 変数定義
Dim srcFolder ' コピー元ファイルパス
Dim dstFolder ' コピー先フォルダパス
Dim objFL ' フォルダ用オブジェクト
Dim objSubFL ' サブフォルダー用オブジェクト
Dim objFile ' ファイル用オブジェクト

' フォルダパス定義
srcFolder = "C:\Users\*****\Desktop\テスト1"
dstFolder = "C:\Users\*****\Desktop\テスト2"

'ファイルシステムオブジェクト定義
Set objFS = CreateObject("Scripting.FileSystemObject")

' フォルダ取得
Set objFL = objFS.GetFolder(srcFolder)

' フォルダ内のファイル毎に、コピー
For Each objFile in objFL.Files
  ' ファイルコピー実行(ファイルあれば上書きする)
  objFS.CopyFile objFile.Path, dstFolder & "\" & objFile.Name, True
Next

' フォルダ内のサブフォルダー内のファイルもコピー
For Each objSubFL in objFL.SubFolders
  ' フォルダ内のファイル毎に、コピー
  For Each objFile in objSubFL.Files
    ' ファイルコピー実行(ファイルあれば上書きする)
    objFS.CopyFile objFile.Path, dstFolder & "\" & objFile.Name, True
  Next
Next

' ファイルオブジェクト解放
Set objFile = Nothing
Set objFL = Nothing
Set objSubFL = Nothing
Set objFS = Nothing

デスクトップ上にある"テスト1"フォルダのファイルと、その中のサブフォルダ内にあるファイルを、"テスト2"フォルダの直下に同じ階層レベルでファイルコピーしてきています。

実行ログファイルを出力する場合のスクリプト

悩める人
悩める人
ログも欲しい!

と思ったので、以下のログをファイルに出力するスクリプトサンプルも作成してみました。

  • 実行日時
  • 処理開始と終了
  • コピーしたファイル名
  • 処理したサブフォルダファイル名

ログサンプルですが、以下のようなログが出るようにしています。

[2022/12/05 10:01:32] 処理開始
[2022/12/05 10:01:32] test1.txt コピー
[2022/12/05 10:01:32] test2.txt コピー
[2022/12/05 10:01:32] フォルダ1 フォルダ処理
[2022/12/05 10:01:32] test3.txt コピー
[2022/12/05 10:01:32] フォルダ2 フォルダ処理
[2022/12/05 10:01:32] test4.txt コピー
[2022/12/05 10:01:33] test5.txt コピー
[2022/12/05 10:01:33] 処理終了

事前準備

出力用のログファイルは作成してく前提です。「fileCopyLog.txt」というテキストファイルを作成しておき、VBScriptと同じ階層に配置しておいてください。ログは追加で書き込むようになっています。

サンプルスクリプト

指定フォルダ・サブフォルダ内のフォルダコピーの過程ログをfileCopyLog.txtに出力するスクリプトサンプルです。

Dim srcFolder ' コピー元ファイルパス
Dim dstFolder ' コピー先フォルダパス
Dim objFL ' フォルダ用オブジェクト
Dim objSubFL ' サブフォルダー用オブジェクト
Dim objFile ' ファイル用オブジェクト
Dim objLogFile ' ログファイル用オブジェクト
Dim logFile ' ログファイル
Dim logMsg ' ログ文字列

' フォルダパス定義
srcFolder = "C:\Users\*****\Desktop\テスト1"
dstFolder = "C:\Users\*****\Desktop\テスト2"

' ログファイルパス定義
logFile = "fileCopyLog.txt"

' ログファイル用システムオブジェクト定義
Set objLogFS = WScript.CreateObject("Scripting.FileSystemObject")
Set objLogFile = objLogFS.OpenTextFile(logFile,8,True)

' ログ書き込み 開始
logMsg = "[" & FormatDateTime(Now, 0) & "]" & Space(1) & "処理開始"
objLogFile.WriteLine(logMsg)


'ファイルシステムオブジェクト定義
Set objFS = CreateObject("Scripting.FileSystemObject")

' フォルダ取得
Set objFL = objFS.GetFolder(srcFolder)

' フォルダ内のファイル毎に、コピー
For Each objFile in objFL.Files
' ファイルコピー実行(ファイルあれば上書きする)
objFS.CopyFile objFile.Path, dstFolder & "\" & objFile.Name, True
' ログ出力
logMsg = "[" & FormatDateTime(Now, 0) & "]" & Space(1) & objFile.Name &" コピー"
objLogFile.WriteLine(logMsg)
Next

' フォルダ内のサブフォルダー内のファイルもコピー
For Each objSubFL in objFL.SubFolders

' ログ出力
logMsg = "[" & FormatDateTime(Now, 0) & "]" & Space(1) & objSubFL.Name &" フォルダ処理"
objLogFile.WriteLine(logMsg)

' フォルダ内のファイル毎に、コピー
For Each objFile in objSubFL.Files
' ファイルコピー実行(ファイルあれば上書きする)
objFS.CopyFile objFile.Path, dstFolder & "\" & objFile.Name, True
' ログ出力
logMsg = "[" & FormatDateTime(Now, 0) & "]" & Space(1) & objFile.Name &" コピー"
objLogFile.WriteLine(logMsg)

Next

Next

' ログ書き込み 終了
logMsg = "[" & FormatDateTime(Now, 0) & "]" & Space(1) & "処理終了"
objLogFile.WriteLine(logMsg)

' ファイルオブジェクト解放
Set objFile = Nothing
Set objFL = Nothing
Set objSubFL = Nothing
Set objFS = Nothing


'ログファイルオブジェクトクローズ,解放
objLogFile.Close
Set objLogFile = Nothing
Set objLogFS = Nothing

長くなってしまいましたが、どのファイルをコピーしたかという跡を残すようにしました!

さいごに

いかがだったでしょうか。サブフォルダに指定フォルダ直下と同じファイル名があったら上書してコピーしちゃいます。厳密なエラー処理なども入れてないので、きれいなスクリプトではないかもしれませんが、どなたかの参考になれば幸いです。それでは、また!