• 締切済み

VBSでフォルダ内のテキストファイルを全て連結するには?

フォルダAの中に以下のファイルがあります。  ・1.txt  ・2.txt   ・   ・   ・  ・10.txt これを全て連結させたsum.txtを出力として同じフォルダに入れたいと考えています。 ファイル名を取得してフォルダの中の上から順番にsum.txtへ書き込んでいけばいいのはわかるんですが どのようにプログラムで書いていいのかわかりません。 特にループさせるところがわかりません。 (初心者ですいません) プログラム例をご教授いただければありがたいです。 また、そういった内容を勉強できるサイトがあれば紹介していただけるとありがたいです。 よろしくお願いいたします。

みんなの回答

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.4

ANo.3お礼への回答です。 >サンプルに書いてもらったものだと >出力が2回繰り返されてしまうのは何ででしょうか? ANo.2、ANo.3のコードでは入力フォルダと同じフォルダにtxtファイルを出力すると、それも連結してしまいます。そのため2回繰り返されたりすることがあります。これを解決するには、別のフォルダに出力するか、出力ファイルを連結から除外するようにすればよいでしょう。 さて、どうしますか?  : (しばらく考察)  : どうしても同じフォルダに出力したい場合、出力ファイルを連結から除外する簡単な方法は、ANo.3のコードのIfに条件を追加することでしょう。例えば、 If (LCase(fso.GetExtensionName(fn))="txt")And(fn.Name<>"sum.txt") Then これは美しくないですね…。出力ファイルを作る前にFilesコレクションからファイル名を配列などに取り出し、必要ならANo.2で触れた並べ替えを行ってから連結すると美しいと思います。

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.3

ANo.2お礼への回答です。 >このvbsファイルがあるローカルフォルダという指定方法はどうしたらよいのでしょうか? WScript.ScriptFullNameで実行中のスクリプトのパスが求まりますので、それを使います。なお、vbsファイルを一緒に置くため拡張子txtのみ取り出すようにする必要があります。コードは例えば下記のようです。 Option Explicit Const OutFileName = "C:\Out\sum.txt" Const ForReading = 1, ForWriting = 2 Dim fso, f, fc, fn, InFile, OutFile Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set f = fso.GetFolder(fso.GetParentFolderName(WScript.ScriptFullName)) Set fc = f.Files Set OutFile = fso.OpenTextFile(OutFileName, ForWriting, true) For Each fn in fc If LCase(fso.GetExtensionName(fn))="txt" Then Set InFile = fso.OpenTextFile(fn, ForReading) OutFile.Write(InFile.ReadAll()) InFile.Close() End If Next OutFile.Close() WScript.Echo "連結が終わりました。" ----- WScript.exeで実行するものとして、入力フォルダ指定とスクリプト起動の方法をいくつか考察しましたので、ついでにアドバイス申し上げます。 (1)ScriptFullNameから実行中のフォルダのパスを求める。フォルダ内にvbsファイルを置いてダブルクリック。  上の方法ですね。もしフォルダが複数だとvbsファイルを複数置くことになり保守が面倒です。 (2)フォルダ名をArgumentsから求める。デスクトップなどにvbsを置いておき、フォルダをドラッグ&ドロップする。  私は好んで使っています。頻繁に使うならお奨めです! (3)フォルダ名をArgumentsから求める。上のバリエーションで、SendToフォルダにvbsを置いておき、フォルダを右クリックして「送る」。  私は好んで使っています。たまに使うならお奨めです! (4)BrowseForFolderでフォルダツリーからフォルダを選択する。適当なところにvbsを置いてダブルクリック。  キー入力が不要でGUIらしいインタフェース。 (5)InputBoxでフォルダのパスをキー入力する。適当なところにvbsを置いてダブルクリック。  InputBoxに全て入力すると面倒。デフォルトを表示して一部書き換えにすれば便利かも。 なお、(2)(3)(4)(5)の方法ではvbsファイルでなくショートカットを置いてもよいです。

jin0711
質問者

お礼

アドバイスありがとうございました! もう少し勉強してみます。 サンプルに書いてもらったものだと 出力が2回繰り返されてしまうのは何ででしょうか?

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.2

ファイル名や個数がわからないのでしたら、WSHドキュメントのFilesコレクションのサンプル等から大筋として下記のようなコードが考えられます。【同じフォルダにはできませんが】ご参考まで。 なお、Windows XP Pro SP2で試したところ、連結の順番が1.txt, 10.txt, 2.txt, 3.txt,…になりました。1.txt, 2.txt, 3.txt,…10.txtの順番にするにはファイル名を取り出して並べ替えてから連結する必要があります。そもそもFilesコレクションからの取り出し順は規定されていないようなので必須の処理かもしれません(?)。 実用向けの改善点としては、入力ファイルが巨大でしたらReadAllではなく1行ずつ連結するとか、拡張子txtのみ取り出すようにするとか、出力ファイルの上書きを確認するとか、あるいは出力ファイル名に日付や時刻を含めるとか。 Option Explicit Const InFolder = "C:\In" Const OutFileName = "C:\Out\sum.txt" Const ForReading = 1, ForWriting = 2 Dim fso, f, fc, fn, InFile, OutFile Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set f = fso.GetFolder(InFolder) Set fc = f.Files Set OutFile = fso.OpenTextFile(OutFileName, ForWriting, true) For Each fn in fc Set InFile = fso.OpenTextFile(fn, ForReading) OutFile.Write(InFile.ReadAll()) InFile.Close() Next OutFile.Close() WScript.Echo "連結が終わりました。"

jin0711
質問者

お礼

回答ありがとうございます! できましたが、 Const InFolder = "C:\In" を指定しないで、このvbsファイルがあるローカルフォルダという指定方法はどうしたらよいのでしょうか?

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

単純連結ならDOSのコマンドでやれば1行で済むんじゃないかと。つまりループさせる必要がありません。 Set wShell = CreateObject("WScript.Shell") Set oExec = wShell.Exec("cmd.exe /c copy c:\1.txt + c:\2.txt + c:\3.txt c:\all.txt") MsgBox oExec.StdOut.ReadAll() この程度なら基礎知識だけなので、特にどこかで勉強するというほどのものでもないですが、まずは基本的なことをさらっと抑えておけばよいんじゃないんですかね。後は引っかかる度に個別で検索すれば。 http://www.google.com/search?num=50&hl=ja&q=WSH%E3%80%80VBS&lr=lang_ja

jin0711
質問者

お礼

回答ありがとうございます! こういう方法もあるんですね! 望んでいるものは出力できました。 他のプログラムにも応用させていただきます。

関連するQ&A

  • フォルダに含まれるテキストファイルを全部連結したい

    複数ファイルを指定して連結するソフトはたくさんあるのですが、フォルダを指定して、その中に含まれる全ファイルを連結するという機能のソフトがなかなか見つかりません。 ちなみに、そのフォルダにサブフォルダがあれば、サブフォルダ中のファイルも一気に連結してしまうことができればなおいいです。

  • perl テキストの連結

    細かくテキストに分けて保存しておいた文章ですが、一つのテキストに連結したいのです。 数が500ほどあるので手動では無理です… 例です 1.txt 2.txt 3.txt を 1、txt  (まとめて) 中身の順番は 1.txt 2.txt 3.txt のような感じにしたいです。 おねがいします。

    • 締切済み
    • Mac
  • テキストファイル連結のDOSコマンドについて

    テキストファイル連結のDOSコマンドについて あるフォルダに下記の様なテキストファイル群があります a.txt、b.txt、c.txt、d.txt・・・・ これらをすべて連結するには copy *.txt all.txt とすればいいのですが、一つ一つのファイルの区切りに目に「■■■■■■■■■■■■■■■」のような区切り文字を入れたいのですが何らかの方法はありますでしょうか?

  • VBSでファイル名と同じフォルダを作成し、移動させる。

    はじめまして。こんにちは。ファイル名の取得、フォルダの作成、移動ができなくて困っています。 たとえばC:\testというフォルダの中にaaa1.txt aaa2.txt,aaa3,txt・・・zzz343.txtというようにファイルがランダムにあったとします。最初の3文字は英語と決まっています。そこでaaa1.txtやaaa2.txtがあればaaaというフォルダを同じ階層に作成し、aaa1.txtとaaa2.txtを新しく作成したaaaというフォルダに移動させる。これをすべてのファイルにたいして行いたいのですがどうすればいいのでしょうか? 参考になるURLやサンプルプログラムがありましたら教えて下さい。よろしくお願い致します。

  • PHPで複数のテキストファイルを読み込みたい

    PHPを勉強中です。 どうしても自力で解決できないので助けてください。 やりたい事は、 「複数ファイルの内容を読み込み、  それらのデータをcsvのセルに入れたい。」のです。 Aというフォルダに、複数のテキストファイルがあります。 これら各ファイルの内容をそれぞれ取得して 「○○.csv」のB列に上から順々に書き込んでいきたいのです。 Aフォルダに入っているテキストファイルは連番を想定しています。 A/ 0001.txt 0002.txt 0003.txt : フォルダに入っているテキストファイルの数はいろいろです。 3枚のフォルダもあれば100枚のフォルダもあります。 これらのファイルの内容を、それぞれ取得して 用意されているcsvファイルの特定のセルに テキストファイルの数だけ順番に入れていきたいのです。 ○○.csv A列  |  B列  |  C列  | △  |0001.txt内容|  △  | △  |0002.txt内容|  △  | △  |0003.txt内容|  △  | : : プログラムのヒントを教えていただければ嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • VBSで指定したフォルダー内のファイルを書き出さないようにする

    あるフォルダ以下のファイル名を出力ファイル、f.name.txtに書き出すのですが "新しいフォルダ"というフォルダのなかにあるファイルは書き出さないようにしたいのですが、意に反してフォルダー内の全てのファイル名を書き出してしまいます。どこがおかしいのでしょう? ********************************************** Set FSO = CreateObject("Scripting.FileSystemObject") Set fl = WScript.CreateObject("Scripting.FileSystemObject") Set abc = fl.CreateTextFile("f.name.txt") ShowSubfolders FSO.GetFolder(".") Sub ShowSubFolders(Folder) For Each File in Folder.Files 'Folder内のファイルを列挙する Fname = File.name FolderCheck=Folder & "\" & "新しいフォルダ" If Folder <> FolderCheck Then abc.Write Folder & "\" & Fname & vbCrLf End If Next For Each Subfolder in Folder.SubFolders 'Foler内のフォルダを列挙する ShowSubFolders Subfolder '再帰呼び出し Next End Sub abc.Close

  • 右クリックでテキストファイルを連結したいのですが

    エクスプローラーのファイル一覧で、ファイルをCTRLキーを使って 複数指定して、右クリックメニューに連結というのを追加して テキストファイルをつなげるプログラム作りたいと思っているのですが、 右クリックで選択した順序というのはプログラム側で取得できるものでしょうか?

  • フォルダ内にあるファイル名を取得したい

    cを利用して、指定したフォルダの中にある全てのファイルの名前を取得するプログラムを作りたいのですが、適した関数がわかりません。 指定するフォルダはあらかじめ決めうちで、その中には.txtのファイルのみを格納します。 どなたか教えてください。できれば自分で作りたいのでヒントをください。お願いします。 VisualC++.netを使っています。OSはXPです。

  • VBSでフォルダ内の最新のファイルを開く方法

    よろしくおねがいします。 あるフォルダ(固定)の中にある、.hogeというファイルのうち、最新のファイルを既定のプログラムで開きたいと考えています。 このフォルダには、.hoge 以外のファイルも混在しています。 既定のプログラムで開くには、 Dim WSH As Object Set WSH = CreateObject("WScript.Shell") WSH.Run """C:\開きたいフォルダ\最新のファイル.hoge""" このように書くことで動作確認できました。 1) フォルダ内で .hoge を列挙して 2) その中で一番更新日時が新しいファイルの名前を取得 この2点ができれば完成なのですが、どうすればよいかわかりません。 具体的な書き方を教えていただけますでしょうか。

  • 複数のテキストファイルを1つにまとめる

    同一フォルダ内にある複数のテキストファイルの内容を1つにまとめる方法を探しております。 例えば、 a.txt, b.txt, c.txt が同一フォルダにあり、 それぞれの内容が AAA BBB CCC である時に、これらをまとめて matome.txtとして、その内容が AAA BBB CCC となるようなプログラムを書きたいのですが、どの様な方法が考えられますでしょうか。 上の例では3つのテキストファイルですが、実際に処理したいファイルは数百個になる為、一つ一つファイル名を入力する作業が大変で困っております。 同一フォルダ内のファイルをファイル名順に一度に読み込み、まとめる方法がありましたらお教え下さい。