人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

VBSの質問です
hogeフォルダの中に
aaa1.html
aaa2.html
aaa10.html
というファイルがあるのですがこれを
数字の若い順に結合できる方法を教えて下さい
Set objShell = CreateObject("WScript.Shell")
objShell.Run "cmd.exe /c copy hoge\*.html ketugo.html",true
というスクリプトで結合すると
aaa1.html
aaa10.html
aaa2.html
の順に結合されてしまいます
どのようなスクリプトを書けばいいのでしょうか?

●質問者: takanii
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● きゃづみぃ
●100ポイント
Const InFolder = "C:\hoge"
Const motofilename = "aaa"
Const OutFileName = "b.html"
Const ForReading = 1, ForWriting = 2
Dim fso, f, fc, fn, InFile, OutFile
Dim k
Dim tb()
Dim tb2()


Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFolder(InFolder)
Set fc = f.Files
k=0
For Each fn in fc
a=instr(fn,".html")
if a>0 then
b=left(fn,a-1)
d=right(b,len(b)-len(InFolder)-1)
c=right(d,len(d)-len(motofilename))
if left(d,len(motofilename))=motofilename then
k=k+1
redim Preserve tb(k)
redim Preserve tb2(k)
tb(k)=c
if trim(tb(k))="" then tb(k)=0
tb(k)=cint(tb(k))
tb2(k)=fn
end if
end if
Next

for a=1 to k
for b=a to k
if tb(a)>tb(b) then
c=tb(a)
tb(a)=tb(b)
tb(b)=c
d=tb2(a)
tb2(a)=tb2(b)
tb2(b)=d
end if
next
next


Set OutFile = fso.OpenTextFile(OutFileName, ForWriting, true)
for c=1 to k
Set InFile = fso.OpenTextFile(tb2(c), ForReading)
OutFile.Write(InFile.ReadAll())
InFile.Close()
next

OutFile.Close()

Const InFolder = "C:\hoge"
ファイルがあるフォルダ

Const motofilename = "aaa"
共通してあるファイル名の一部

Const OutFileName = "b.html"
出力するファイル名
スクリプトを実行したところに 出力されます。


takaniiさんのコメント
vbsファイルと同じフォルダの中に入ってるhtmlファイルを結合したい場合 Const InFolder = "C:\hoge" はどのように設定すればいいのでしょうか? あとhtmlファイルの拡張子がhtmになっている場合 どこをいじればいいのでしょうか?

きゃづみぃさんのコメント
とりあえず >あとhtmlファイルの拡張子がhtmになっている場合 a=instr(fn,".html") ↓ a=instr(fn,".htm")

きゃづみぃさんのコメント
>|vb| Const motofilename = "aaa" Const OutFileName = "b.html" Const ForReading = 1, ForWriting = 2 Dim fso, f, fc, fn, InFile, OutFile Dim k Dim tb() Dim tb2() strPATH = Wscript.ScriptFullName InFolder = Left(strPATH,InStrRev(strPATH,"\")-1) Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set f = fso.GetFolder(InFolder) Set fc = f.Files k=0 For Each fn in fc a=instr(fn,".html") if a>0 then b=left(fn,a-1) d=right(b,len(b)-len(InFolder)-1) c=right(d,len(d)-len(motofilename)) if left(d,len(motofilename))=motofilename then k=k+1 redim Preserve tb(k) redim Preserve tb2(k) tb(k)=c if trim(tb(k))="" then tb(k)=0 tb(k)=cint(tb(k)) tb2(k)=fn end if end if Next for a=1 to k for b=a to k if tb(a)>tb(b) then c=tb(a) tb(a)=tb(b) tb(b)=c d=tb2(a) tb2(a)=tb2(b) tb2(b)=d end if next next Set OutFile = fso.OpenTextFile(OutFileName, ForWriting, true) for c=1 to k Set InFile = fso.OpenTextFile(tb2(c), ForReading) OutFile.Write(InFile.ReadAll()) InFile.Close() next OutFile.Close() ||< スクリプトと同じフォルダにある場合です。

takaniiさんのコメント
2つ目に書いていただいたスクリプトを a1.html a2.htmlというファイルが入ってるフォルダで実行すると結合できたのですが aa1.html aa2.htmlという2文字以上のファイルが入ってるフォルダで実行した場合 21行目に プロシージャの呼び出し、または因数が不正です コード800A0005 と出てきます

きゃづみぃさんのコメント
Const motofilename = "aaa" を Const motofilename = "aa" に実行して エラーとなったということでしょうか? 確認してみます。

きゃづみぃさんのコメント
エラーは ないですね。 a1.html やaa1.htmlなどが 混在している環境だと 正しく動かないですね。 分けられるなら フォルダを わけたほうがいいです。

きゃづみぃさんのコメント
混在している場合は、指定したファイル名のものだけ連結するように修正しました。 >|vb| Const motofilename = "aa" Const OutFileName = "b.html" Const ForReading = 1, ForWriting = 2 Dim fso, f, fc, fn, InFile, OutFile Dim k Dim tb() Dim tb2() strPATH = Wscript.ScriptFullName InFolder = Left(strPATH,InStrRev(strPATH,"\")-1) Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set f = fso.GetFolder(InFolder) Set fc = f.Files k=0 For Each fn in fc a=instr(fn,".html") if a>0 then b=left(fn,a-1) d=right(b,len(b)-len(InFolder)-1) if len(d)-len(motofilename) > 0 then c=right(d,len(d)-len(motofilename)) if left(c,1)>="0" and left(c,1)<="9" then if left(d,len(motofilename))=motofilename then k=k+1 redim Preserve tb(k) redim Preserve tb2(k) tb(k)=c if trim(tb(k))="" then tb(k)=0 tb(k)=cint(tb(k)) tb2(k)=fn end if end if end if end if Next for a=1 to k for b=a to k if tb(a)>tb(b) then c=tb(a) tb(a)=tb(b) tb(b)=c d=tb2(a) tb2(a)=tb2(b) tb2(b)=d end if next next Set OutFile = fso.OpenTextFile(OutFileName, ForWriting, true) for c=1 to k Set InFile = fso.OpenTextFile(tb2(c), ForReading) OutFile.Write(InFile.ReadAll()) InFile.Close() next OutFile.Close() ||<
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ