こんなスクリプト作りたいなーと思いついたのはいいものの、
「あ、再帰処理必要だ。前どうやって作ったっけ?」となることが多々あります。
とりあえず、再帰処理のテンプレートをある程度作っておけばいいのではと思い、作成しました。
再帰処理テンプレート
Option Explicit
On Error Resume Next
' ==============================
' 変数
' ==============================
Dim objWshShell 'WshShellオブジェクト
Dim objFileSys 'ファイルシステムオブジェクト
Dim objFolder
Dim objParam
Dim objRecurFolder
Dim objRecurFile
Dim objRecurSubFolder
Dim strNextPath
Dim strTargetFolderPath
' ==============================
' 定数
' ==============================
Const ForReading = 1, ForWriting = 2, ForAppending = 8
' ==============================
' 処理
' ==============================
set objWshShell = WScript.CreateObject("WScript.Shell")
'ファイルシステムオブジェクト
Set objFileSys = WScript.CreateObject("Scripting.FileSystemObject")
'引数チェック
set objParam = WScript.Arguments
If objParam.Count = 0 Then
strTargetFolderPath = InputBox("対象のフォルダを選択してください。")
Else
strTargetFolderPath = objParam(0)
End If
'ファイル名が入力されなかったら終了
If strTargetFolderPath = "" Then
WScript.Quit
End If
Call Recursion(strTargetFolderPath)
Set objRecurSubFolder = Nothing
Set objRecurFolder = Nothing
MsgBox "完了",vbInformation
' ==============================
' 関数
' ==============================
' ----------------------
' 再帰関数
' ----------------------
Sub Recursion(ByVal path)
Set objRecurFolder = objFileSys.GetFolder(path)
'フォルダ内のファイルでループ
For Each objRecurFile In objRecurFolder.Files
'再帰中の処理
'Call
Next
'サブフォルダ内へ
For Each objRecurSubFolder In objRecurFolder.SubFolders
strNextPath = path & "\" & objRecurSubFolder.Name
Call Recursion(strNextPath)
Next
End Sub
再帰処理を使った例(フォルダ内のテキストファイルを読み込む)
Option Explicit
On Error Resume Next
' ==============================
' 変数
' ==============================
Dim objWshShell 'WshShellオブジェクト
Dim objFileSys 'ファイルシステムオブジェクト
Dim objFolder
Dim objParam
Dim objRecurFolder
Dim objRecurFile
Dim objRecurSubFolder
Dim strNextPath
Dim strTargetFolderPath
Dim strParentFolder
Dim objFileOutput
Dim strOutString
Dim objFileText
' ==============================
' 定数
' ==============================
Const ForReading = 1, ForWriting = 2, ForAppending = 8
' ==============================
' 処理
' ==============================
set objWshShell = WScript.CreateObject("WScript.Shell")
'ファイルシステムオブジェクト
Set objFileSys = WScript.CreateObject("Scripting.FileSystemObject")
'引数チェック
set objParam = WScript.Arguments
If objParam.Count = 0 Then
strTargetFolderPath = InputBox("対象のフォルダを選択してください。")
Else
strTargetFolderPath = objParam(0)
End If
'ファイル名が入力されなかったら終了
If strTargetFolderPath = "" Then
WScript.Quit
End If
strParentFolder = objFileSys.getParentFolderName(WScript.ScriptFullName)
Set objFileOutput = objFileSys.CreateTextFile(strParentFolder & "\output.txt", True)
strOutString=""
Call Recursion(strTargetFolderPath)
objFileOutput.Write strOutString
objFileOutput.Close
Set objRecurSubFolder = Nothing
Set objRecurFolder = Nothing
MsgBox "完了",vbInformation
' ==============================
' 関数
' ==============================
' ----------------------
' 再帰関数
' ----------------------
Sub Recursion(ByVal path)
Set objRecurFolder = objFileSys.GetFolder(path)
'フォルダ内のファイルでループ
For Each objRecurFile In objRecurFolder.Files
'再帰中の処理
Call TextReadAll(objRecurFile)
Next
'サブフォルダ内へ
For Each objRecurSubFolder In objRecurFolder.SubFolders
strNextPath = path & "\" & objRecurSubFolder.Name
Call Recursion(strNextPath)
Next
End Sub
Sub TextReadAll(ByVal path)
Set objFileText = objFileSys.OpenTextFile(path, ForReading)
strOutString = strOutString & objFileText.ReadAll & vbCrLf
objFileText.Close
End Sub
サブフォルダも含め、すべてのファイルの文字列をoutput.txtに書き出すスクリプトです。
VBScript関連書籍の選び方
ネット検索で十分だと思いますが、書籍で勉強する場合はサンプルが載っていたり、
逆引きができる本がおすすめです。
[改訂版] VBScriptポケットリファレンス (POCKET REFERENCE) 新品価格 |