• ベストアンサー

Winでのバッチ処理

CygwinもしくはMS-DOSプロンプトで以下のようなことは出来るでしょうか? あるディレクトリ内に.docファイルと.txtファイルが複数あり txtファイルだけを選択して、すべてのtxtファイルに記入されている dogという単語をcatという単語に書きかえる。 上記のような処理を一括して行うことは可能でしょうか? 済みませんがその方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • arata
  • ベストアンサー率49% (139/279)
回答No.2

MS Wordが使えるのでしたら、WSHからWordを使って置換するマクロがありますので、使ってみますか? ちょっと長いのですが、下記を切り取って「WordRepl.vbs」というファイル名で保存してください。 --------------------------------------------- ' ' Wordによる一括置換マクロ ' Dim objFso Dim objSubDirs Dim objDir Dim objFile Dim sDir Dim objWord Dim sFile Dim objDoc Dim ojbFind Dim sFrom Dim sTo ' 使い方の表示 If WScript.Arguments.Count < 2 Then WScript.Echo( "Usage:" + vbCrLf + "CScript WordRepl.vbs 置換対象文字列 置換文字列 [ディレクトリ]") WScript.Quit End If ' 変換前文字列 sFrom = WScript.Arguments.Item(0) ' 変換後文字列 sTo = WScript.Arguments.Item(1) ' フォルダの指定 If WScript.Arguments.Count > 2 Then sDir = WScript.Arguments.item(2) Else sDir = "." End If ' ワードの起動 Set objWord = CreateObject("Word.Application") ' FileSystemObjectの作成 Set objFso = CreateObject("Scripting.FileSystemObject") ' ディレクトリの取得 Set objDir = objFso.GetFolder(sDir) ' 特殊なファイルが混じっているとエラーになることがあるため、 ' エラーをトラップしている。 On Error Resume Next ' 正規表現処理のオブジェクト Set reg = New RegExp ' ファイル名を指定 reg.Pattern = ".*txt$" ' objWord.Visible = true Err.Clear For Each objFile In objDir.Files If Err.Number = 0 Then If reg.test(objFile.Name) = True Then if Right(objDir.Path,1) <> "\" Then sFile = objDir.Path + "\" + objFile.Name Else sFile objDir.Path + objFile.Name End If On Error Goto 0 ' ファイルのオープン Set objDoc = objWord.Documents.Open( sFile ) ' 置換処理 objDoc.Select Set objFind = objWord.Selection.Find objFind.Execute sFrom,True,,,,,,,,sTo,2 ' ファイルの保存 objDoc.Save ' ファイルのクローズ objDoc.Close End If End If On Error Resume Next Next On Error Goto 0 ' あとしまつ objWord.Quit Set objWord = Nothing Set objFile = Nothing Set reg = Nothing Set objFolder = Nothing --------------------------------------------- 使い方は、コマンドプロンプトで、 CScript WordRepl.vbs 変換対象の文字列 変換後の文字列 [ディレクトリ名] です。ディレクトリ名を省略するとカレントディレクトリのファイルについて処理します。 なお、WSHがないと動きません。コマンドプロンプトで、 CScript として、使い方が出てくれば動くとおもいます。 正規表現を使っているので、Ver.5以上でないと動かないかもしれません。 WSHが入っていない場合は、下記からダウンロードしてください。 http://www.microsoft.com/japan/developer/scripting/default.htm?/Japan/Developer/Scripting/windowshost/download/default.htm

tanicchi
質問者

お礼

ご回答有難うございます。 残念ながらMSWORDを所有しておりませんので上記スクリプトを使用することが出来ませんが、購入する機会がありましたらその際には利用させていただきたいと思います。

その他の回答 (3)

  • arata
  • ベストアンサー率49% (139/279)
回答No.4

そうですかWordが使えないのですか、しかたないですね。 WSHだけのものに改造しました。 使い方は、いっしょです。置換対象文字列に正規表現が使えるようになりました。 えーとマクロのファイル名は、TextRepl.vbsとしてください。 そうそう、ワークとして、元のファイル名の最後に.$$$がついたファイルを同じディレクトリに作成します。たとえば、元のファイルがTest.txtならTest.txt.$$$ができます。このファイルは変換前のファイルがコピーされたものです。 ' ' Text一括置換マクロ ' ' 使い方の表示 If WScript.Arguments.Count < 2 Then WScript.Echo( "Usage:" + vbCrLf + "CScript TextRepl.vbs 置換対象文字列 置換文字列 [ディレクトリ]") WScript.Quit End If ' 変換前文字列 sFrom = WScript.Arguments.Item(0) ' 変換後文字列 sTo = WScript.Arguments.Item(1) ' フォルダの指定 If WScript.Arguments.Count > 2 Then sDir = WScript.Arguments.item(2) Else sDir = "." End If ' FileSystemObjectの作成 Set objFso = CreateObject("Scripting.FileSystemObject") ' ディレクトリの取得 Set objDir = objFso.GetFolder(sDir) ' 特殊なファイルが混じっているとエラーになることがあるため、 ' エラーをトラップしている。 On Error Resume Next ' 文字列置換の正規表現の作成 Set regText = New RegExp regText.IgnoreCase = False regText.Global = True regText.Pattern = sFrom ' ファイル名チェックの正規表現の作成 Set reg = New RegExp reg.IgnoreCase = True reg.Pattern = ".*TXT$" Err.Clear For Each objFile In objDir.Files If Err.Number = 0 Then If reg.test(objFile.Name) = True Then If Right(objDir.Path, 1) <> "\" Then sFile = objDir.Path + "\" + objFile.Name Else sFile = objDir.Path + objFile.Name End If sWork = sFile + ".$$$" Err.Clear On Error GoTo 0 WScript.Echo (sFile + " 処理中") ' ファイル名に$$$をつけたファイルにコピー objFso.CopyFile sFile, sWork, True ' ファイルのオープン Set objFile = objFso.OpenTextFile(sWork, 1) Set objDest = objFso.OpenTextFile(sFile, 2,True) ' 置換処理 Do Until objFile.AtEndOfStream sLine = objFile.ReadLine sLine = regText.Replace( sLine ,sTo) objDest.WriteLine( sLine ) Loop objFile.Close objDest.Close End If End If Next On Error Goto 0 ' あとしまつ Set objFile = Nothing Set objDest = Nothing Set reg = Nothing Set regText = Nothing Set objFolder = Nothing

tanicchi
質問者

お礼

有難うございました。 教えていただいたVBSCript本当に助かりました。 複数のフォルダ内にあるファイルに同じような処理を行わなければならない状況にあったため、教えていただいたスクリプトをbatファイルに書きこんで一括して変換することが出来ました。 ' 文字列置換の正規表現の作成 の部分を少し修正するだけで、.txtではないテキスト形式のファイルにも使うことが出来そうですね。 これをきっかけにVBSCriptもすこし勉強してみようかなと思いました。 また、何か質問を投げかけた際にはお力添えよろしくお願いします。

  • arata
  • ベストアンサー率49% (139/279)
回答No.3

一箇所間違えてました。 reg.Pattern = ".*txt$" は、 reg.Pattern = ".*[tT][xX][tT]$" が正しいので、修正してください。

  • poor_Quark
  • ベストアンサー率56% (1020/1799)
回答No.1

 sedはどうでしょう。

参考URL:
http://www.vector.co.jp/soft/win95/util/se015016.html
tanicchi
質問者

お礼

ご協力有難うございます。 また何かありましたらそのときはよろしくお願いします。

tanicchi
質問者

補足

sedでどのような処理を記述すれば良いのでしょうか?

関連するQ&A

  • MS-DOSのバッチによるファイルリネームの方法

    いつもお世話になります。 MS-DOS(windows XP)で、あるディレクトリ内のファイルを一括リネームするようなバッチスクリプトを作成しようとしています。 ファイル名は、例えば「10P1125532_20080130135757_condA_para50.txt」というような感じで、後半の「_condA_para50.txt」は共通で、これが2万ファイルほどあります。 それで、後半の「_condA_para50」の部分を削除しようとして、まずはコマンドプロンプトでそのディレクトリに移動してから、 ren *_condA_para50.txt *.txt とやったのですが、認識されていないのか、リネームされませんでした。(エラーも出ませんでした) スクリプトに書く場合は、どのようにすればちゃんとリネームされるのでしょうか? よろしくお願いします。

  • コマンドプロンプトによるファイル名一括変換

    コマンドプロンプトで、サブディレクトリを含めたファイル名の一括変換 をしたいのですが、次のコマンドを叩いたら、「コマンドの構文が間違っています」と出てしまいました。どこがおかしいのでしょうか? カレントディレクトリの中の「*.txt」ファイルをすべて「*.doc」にしたい場合↓ for /r /d %i in (*) do ren %i\*.txt *.doc よろしくお願いします。

  • バッチコマンドを作りたい

    MS-DOSでのバッチコマンドについての質問です。 パスを引数で指定して、そのパスのディレクトリ以下(サブディレクトリも含む)のファイル名を全て取得し、加工して表示するバッチを作りたいのですが・・。 例えばコマンド名を jcm をすると C:\>jcm C:\temp と入力すると(「C:\temp」は引数)、C:\temp以下(サブフォルダも含めて)にある全てのファイル名を取得し、ファイル名がA.txt,B.txtだったとすると java A.txt java B.txt のように加工して表示したのです。 バッチファイルの中身はどのように記述すればよいでしょうか?

  • リダイレクト >> を複数のファイルに同時に行いたい

    cat A.txt >> B.txt とコマンドを実行することで、B.txtの末尾にA.txtが挿入されると思います。 これを利用して、複数のファイル(拡張子がtxt)全てにA.txtの内容を挿入させたいのですが、その場合はどういったコマンドを打てばいいのでしょうか? 何か、ディレクトリの中のファイル全てに対して再帰的に処理を施す、という方法がありましたら、お教えください。

  • ワイルドカードの処理(win/dos)

    perlでワイルドカードの処理をするにはどうしたらよいでしょうか? 具体的には、ワイルドカードに該当したファイル分、 下記の処理をしたいのですが。 OSはWindows(DOSプロンプト)です。 (Windows(MS-DOS)はUNIXと違って、 ワイルドカードの展開をアプリケーション任せにしているようです。) -- while (<>) { if ($. == 2) { print; last; } } --

    • ベストアンサー
    • Perl
  • デスクトップの隠しファイルの名前をリネームしてしまいました

    WindowsXPです。 リネーム君というソフトを使い、デスクトップ上のファイルを複数選択して一括リネームしようと試みました。 しかし、リネームしたいものだけ複数選択をしてもディレクトリ単位で作業するらしく、隠しファイルまでリネームしてしまいました。 何かシステム上重要なファイルで、リネームにより参照できなくなりはしないか心配です。(現状ではまだ何も起きておりませんが) .iniと.dbと.docの形式のファイルが1つずつあります。 このうち、.docファイルだけは隠しファイルの表示でデスクトップに表示することができました。 もし、わかるようなら元ファイル名を教えていただけませんでしょうか? よろしくお願いします。

  • windows2000のコマンドプロンプトのショートカット毎のバッチファイルの自動実行

    お世話になります。 現在、コマンドプロンプトのショートカットを起動した後、 物によって別々のバッチファイルを実行しています。 (複数のディレクトリにショートカットがあります) そこで、ショートカット毎に自動実行されるバッチファイルを 指定したいのですが、どのようにすればいいのか分かりません。 windows98の頃のMS-DOSプロンプトの頃は、 ショートカットのプロパティを見ると、 「バッチファイル」という項目があって、 ショートカット毎に実行できるバッチファイルが 指定できたと思いますが、 windows2000のコマンドプロンプトの場合は どのように行えばいいのでしょうか?

  • XPバッチプログラムについて

    すいませんおしえてください windowsXPでバッチファイルを作成しています。 動作内容は↓の通りです。 (1)バッチファイルが置いてあるカレントディレクトリ配下にある複数のディレクトリから、ファイル名に「test」を含む.txtファイルを カレントディレクトリにコピーする。(これをカレントディレクトリ配下のディレクトリがなくなるまで繰り返す) ※簡単に言うと、1つ下のディレクトリからコピーしてくるということです。 (2)既にカレントディレクトリに同じ名前のファイルが存在する場合は自動的に連番して上書きしないようにコピーする。 今、(1)については下記の通り作成して動作確認しましたが、このままでは複数のディレクトリに同じファイル名が 存在する場合に上書きされてしまいます。 (2)についてなかなか上手くコーディングできないのですが↓のプログラムに追加すればよいものを教えていただけますでしょうか? もしくは、全体的に間違っていれば、その部分もご指摘お願い致します。 @echo off for /d %%d in (*) do ( if exist %%d\*test*.txt copy %%d\*test*.txt *test*.txt ) 以上、よろしくお願い致します。

  • バッチ処理について

    コマンドプロンプトでのバッチ処理についてお伺いします。 【環境】 Windows XP SP3 【要件】 特定ディレクトリにあるファイルにおいて、○○Byte以下のファイルを削除する。 上記の要件に則ってバッチファイルを作成する事となりました。全くの無知で検索した所、 下記のサイトに辿り着き、お知恵を拝借させて頂きました。 http://www.fpcu.jp/dosvcmd/bbs/log/delerase/4-0062.html -------------------- @ECHO OFF FOR /F %%F IN ('dir /B') DO ( CALL :CheckFile %%F ) EXIT /B :CheckFile SET FileAttrib=%~a1 IF NOT %FileAttrib:~0,1%==d ( IF %~z1 == 0 ( ECHO "%1" はファイルサイズが 0 なので削除します。 REM DEL %1 ) ) EXIT /B -------------------- いくつかの文献を読み、大方の内容と要件に沿った処理を行えるまでには至ったのですが、 どうしても6-7行目を理解する事が出来ません(IF処理では無く、FileAttribの行り、SET処理についてです)。 どなかたご教示頂けないでしょうか。

  • ファイル選択ダイアログで複数の拡張子を有効に

    Ruby+VisualuRubyでプログラムを作っています。 ファイル選択ダイアログで file_name = SWin::CommonDialog::openFilename(nil, [["テキスト(*.txt)","*.txt"],["DOC(*.doc)","*.doc"],["DOCX(*.docx)","*.docx"]], 0x1000, "ファイル選択") とすれば、複数の拡張子からの選択が可能になるのはわかったのですが、 これだと、拡張子を選んで、その拡張子のファイルから選択することになります。 同時に、複数の拡張子のファイルを表示し、その中から選択するようにはできないのでしょうか?

    • ベストアンサー
    • Ruby