
フォルダAの中に以下のファイルがあります。
・1.txt
・2.txt
・
・
・
・10.txt
これを全て連結させたsum.txtを出力として同じフォルダに入れたいと考えています。
ファイル名を取得してフォルダの中の上から順番にsum.txtへ書き込んでいけばいいのはわかるんですが
どのようにプログラムで書いていいのかわかりません。
特にループさせるところがわかりません。
(初心者ですいません)
プログラム例をご教授いただければありがたいです。
また、そういった内容を勉強できるサイトがあれば紹介していただけるとありがたいです。
よろしくお願いいたします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
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で触れた並べ替えを行ってから連結すると美しいと思います。
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ファイルでなくショートカットを置いてもよいです。
アドバイスありがとうございました!
もう少し勉強してみます。
サンプルに書いてもらったものだと
出力が2回繰り返されてしまうのは何ででしょうか?
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 "連結が終わりました。"
回答ありがとうございます!
できましたが、
Const InFolder = "C:\In"
を指定しないで、このvbsファイルがあるローカルフォルダという指定方法はどうしたらよいのでしょうか?
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% …
回答ありがとうございます!
こういう方法もあるんですね!
望んでいるものは出力できました。
他のプログラムにも応用させていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VBSを使用し、指定フォルダ内のテキストファイルを一つに結合させたい
Visual Basic(VBA)
-
VBS ファイルマージ処理
その他(プログラミング・Web制作)
-
ファイル結合について
Visual Basic(VBA)
-
-
4
VBSで指定行に挿入
その他(プログラミング・Web制作)
-
5
VBSの処理中一旦処理を止めて再開させたい。
Visual Basic(VBA)
-
6
vbsからのExcelマクロ呼び出しの際に保存ダイアログが表示されてしまう
その他(プログラミング・Web制作)
-
7
VBScriptでファイルの日時順(降順)で並び替えて一覧を出力したい。
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
.txtではなく.logの方が良いの...
-
UWSCでテキストファイルを開い...
-
バッチ処理でファイルの中身を...
-
バッチファイル 複数ファイル...
-
ファイルの最後に文字列挿入
-
エクセルでグラフが書きたいです。
-
psqlでエラーログをとりたい
-
VBAでワークシートを引数として...
-
Windows マシンでFTPバッチが動...
-
多数のサブディレクトリ内のフ...
-
ファイル名の一部をbatで変更し...
-
ファイルから文字列(英単語)を...
-
EXCEl/VBAで拡張子なしのファイ...
-
VBAのSaveFileNamePathメソッド
-
フォルダ階層のあるzipファイル...
-
拡張子を元に戻す
-
VBAでのファイル出力形式
-
ファイル内容の修正、行削除に...
-
ASPでの「ダメ文字」対策について
-
テキストファイルクリア .net2...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
拡張子を元に戻す
-
.txtではなく.logの方が良いの...
-
VBAでワークシートを引数として...
-
多数のサブディレクトリ内のフ...
-
psqlでエラーログをとりたい
-
COPYコマンドで結合すると余計...
-
エクセルの各セルの内容をそれ...
-
バッチファイルで文字列削除に...
-
ファイルの最後に文字列挿入
-
UWSCでテキストファイルを開い...
-
バッチファイル 複数ファイル...
-
renameコマンドについて
-
ファイル名の一部をbatで変更し...
-
forfilesで検索したファイルを...
-
外部exeに対しての引数受け渡し
-
Windowsのバッチファイルを利用...
-
VBSでフォルダ内のテキストファ...
-
VBAでエクセルをtxtに変換する...
-
ExcelVBA テキストファイルUNIC...
おすすめ情報