VBSの質問です

aフォルダ
********************
01
02
03
04


k
********************
aフォルダには01~n番までフォルダがあります
各々のフォルダの中にはb.htmlファイルが入っているのですが

以下のVBSスクリプトを01~n番まで当てはめれるようなスクリプトに書き換えてください
hoge.vbs
********************
Dim objFile ' 対象ファイル
Dim oldText ' 置換前テキスト
Dim newText ' 置換後テキスト
Dim objFSO ' ファイルシステムオブジェクト
Dim objRep ' 正規表現オブジェクト
Dim repText ' 置換後文字列
Dim objPath

Set objPath = CreateObject("Scripting.FileSystemObject").GetFolder(".")
Set objPath2 = CreateObject("Scripting.FileSystemObject").GetFolder("..")
p = right(objPath,len(objPath) - len(objPath2) -1)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("01/b.html")
oldText = objFile.ReadAll
repText = "<img src = ""01/"
Set objRep = New RegExp
objRep.Multiline = True
objRep.Pattern = "<img src = """
objRep.Global = True
newText = objRep.replace(oldText, repText)
objFile.Close
Set objFile = objFSO.CreateTextFile("01.html")
objFile.WriteLine (newText)
objFile.Close
********************

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/03/13 00:30:03

回答2件)

id:cx20 No.1

回答回数607ベストアンサー獲得回数108

以下、サンプルです。
対象フォルダは 01~n番 というわけではなく、カレントディレクトリ直下のサブディレクトリを対象としてます。
b.html が存在しない場合などで、エラーになるかもしれません。

' File : ChangePathName.vbs
' Usage : CScript ChangePathName.vbs
Option Explicit

Call Main()

Sub Main()
    Dim fso ' ファイルシステムオブジェクト
    Set fso = CreateObject("Scripting.FileSystemObject")

    Dim folder
    Set folder = fso.GetFolder(".")
    
    Dim subFolder
    For Each subFolder In folder.SubFolders
        WScript.Echo "[" & subFolder.Name & "] フォルダを処理中です。"
        Call ChangePathName( fso, subFolder.Name )
    Next
End Sub

Sub ChangePathName( fso, strFolderName )
    Dim file       ' 対象ファイル
    Dim file2      ' 書き込み先ファイル
    Dim re         ' 正規表現オブジェクト
    Dim strOldText ' 置換前テキスト
    Dim strNewText ' 置換後テキスト
    Dim strFind    ' 検索文字列
    Dim strReplace ' 置換文字列
    
    Set file = fso.OpenTextFile( strFolderName & "/b.html")
    strOldText = file.ReadAll
    strFind    = "<img src = """
    strReplace = "<img src = """ & strFolderName & "/"
    Set re = New RegExp
    re.Multiline = True
    re.Pattern = strFind
    re.Global = True
    strNewText = re.Replace(strOldText, strReplace)
    file.Close
    Set file2 = fso.CreateTextFile( strFolderName & ".html")
    file2.WriteLine (strNewText)
    file2.Close
End Sub

実行前のフォルダ構成

C:\home\edu\hatena\takanii\1362497323
└─a
    │  ChangePathName.vbs
    ├─01
    │      b.html
    ├─02
    │      b.html
    └─03
           b.html

実行方法。コマンドプロンプトにて以下を実行。
(フォルダが C:\home\edu\hatena\takanii\1362497323\a である場合)

C:\> CD C:\home\edu\hatena\takanii\1362497323\a [Enter]
C:\home\edu\hatena\takanii\1362497323\a> CScript ChangePathName.vbs [Enter]

Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

[01] フォルダを処理中です。
[02] フォルダを処理中です。
[03] フォルダを処理中です。
  :

実行後のフォルダ構成。

C:\home\edu\hatena\takanii\1362497323
└─a
    │  ChangePathName.vbs
    │  01.html
    │  02.html
    │  03.html
    ├─01
    │      b.html
    ├─02
    │      b.html
    └─03
           b.html
id:takanii

aフォルダの中のhogeフォルダの中に生成したhtmlを入れたい場合
Set folder = fso.GetFolder(".")ここをどのようにいじればいいのでしょうか?

2013/03/06 02:01:56
id:cx20

a\hoge フォルダに作成するようプログラムを修正しました。
(あと、フォルダ名が数値の場合のみを、対象とするよう修正しました。)
事前に a\hoge フォルダを作成した後、プログラム実行願います。

' File : ChangePathName.vbs
' Usage : CScript ChangePathName.vbs
Option Explicit

Call Main()

Sub Main()
    Dim fso ' ファイルシステムオブジェクト
    Set fso = CreateObject("Scripting.FileSystemObject")

    Dim folder
    Set folder = fso.GetFolder(".")
    
    Dim strTargetName       ' 対象フォルダ名
    Dim strInputFileName    ' 入力ファイル名
    Dim strOutputFileName   ' 出力ファイル名

    Dim subFolder
    For Each subFolder In folder.SubFolders
        strTargetName = subFolder.Name
        ' フォルダ名が数字の場合、処理対象とする
        If IsNumeric( strTargetName ) Then
            strInputFileName = subFolder & "\b.html"
            strOutputFileName = folder.Path & "\hoge\" & strTargetName & ".html"
            WScript.Echo "[" & strTargetName & "] フォルダを処理中です。"
            Call ChangePathName( fso, strTargetName, strInputFileName, strOutputFileName )
        End If
    Next
End Sub

Sub ChangePathName( fso, strTargetName, strInputFileName, strOutputFileName )
    Dim file       ' 対象ファイル
    Dim file2      ' 書き込み先ファイル
    Dim re         ' 正規表現オブジェクト
    Dim strOldText ' 置換前テキスト
    Dim strNewText ' 置換後テキスト
    Dim strFind    ' 検索文字列
    Dim strReplace ' 置換文字列
    
    Set file = fso.OpenTextFile( strInputFileName )
    strOldText = file.ReadAll
    strFind    = "<img src = """
    strReplace = "<img src = """ & strTargetName & "/"
    Set re = New RegExp
    re.Multiline = True
    re.Pattern = strFind
    re.Global = True
    strNewText = re.Replace(strOldText, strReplace)
    file.Close
    Set file2 = fso.CreateTextFile( strOutputFileName )
    file2.WriteLine (strNewText)
    file2.Close
End Sub

実行後のフォルダ構成。

C:\home\edu\hatena\takanii\1362497323
└─a
    │  ChangePathName.vbs
    ├─01
    │      b.html
    ├─02
    │      b.html
    ├─03
    │      b.html
    └─hoge
           01.html
           02.html
           03.html
2013/03/06 20:41:25
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

Dim objFile ' 対象ファイル
Dim oldText ' 置換前テキスト
Dim newText ' 置換後テキスト
Dim objFSO ' ファイルシステムオブジェクト
Dim objRep ' 正規表現オブジェクト
Dim repText ' 置換後文字列
Dim objPath

Set objPath = CreateObject("Scripting.FileSystemObject").GetFolder(".")
Set objPath2 = CreateObject("Scripting.FileSystemObject").GetFolder("..")
p = right(objPath,len(objPath) - len(objPath2) -1)
Set objFSO = CreateObject("Scripting.FileSystemObject")
for a=1 to 99
	b=right(cstr(100+a),2)
	If objFso.FolderExists(objPath & "\" & b) Then
		Set objFile = objFSO.OpenTextFile(b & "/b.html")
		oldText = objFile.ReadAll
		repText = "<img src = """ & b & "/"
		Set objRep = New RegExp
		objRep.Multiline = True
		objRep.Pattern = "<img src = """
		objRep.Global = True
		newText = objRep.replace(oldText, repText)
		objFile.Close
		Set objFile = objFSO.CreateTextFile( b & ".html")
		objFile.WriteLine (newText)
		objFile.Close
	end if
next

質問にあるソースをそのまま
>01~n番まで当てはめれるようなスクリプトに
書き換えました。

ちなみに 01からなので2桁ということで 最大99番までを想定しています。

for a=1 to 99
の 99を 99以下にしてもらってもいいです。

他2件のコメントを見る
id:taknt

hogeという フォルダがなかったら作成してください。

2013/03/06 17:55:00
id:taknt

あと

Set objFile = objFSO.CreateTextFile( objPath & "\hoge\" & b & ".html")

こちらでした。
ちょっと間違えました。失礼しました。

2013/03/06 23:11:23

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません