VBSの再帰処理

こんなスクリプト作りたいなーと思いついたのはいいものの、

「あ、再帰処理必要だ。前どうやって作ったっけ?」となることが多々あります。

とりあえず、再帰処理のテンプレートをある程度作っておけばいいのではと思い、作成しました。

再帰処理テンプレート

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)

新品価格
¥2,068から
(2022/1/22 21:53時点)

Leave a Reply

Your email address will not be published.

CAPTCHA