- ベストアンサー
Winでのバッチ処理
CygwinもしくはMS-DOSプロンプトで以下のようなことは出来るでしょうか? あるディレクトリ内に.docファイルと.txtファイルが複数あり txtファイルだけを選択して、すべてのtxtファイルに記入されている dogという単語をcatという単語に書きかえる。 上記のような処理を一括して行うことは可能でしょうか? 済みませんがその方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
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
その他の回答 (3)
- arata
- ベストアンサー率49% (139/279)
そうですか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
お礼
有難うございました。 教えていただいたVBSCript本当に助かりました。 複数のフォルダ内にあるファイルに同じような処理を行わなければならない状況にあったため、教えていただいたスクリプトをbatファイルに書きこんで一括して変換することが出来ました。 ' 文字列置換の正規表現の作成 の部分を少し修正するだけで、.txtではないテキスト形式のファイルにも使うことが出来そうですね。 これをきっかけにVBSCriptもすこし勉強してみようかなと思いました。 また、何か質問を投げかけた際にはお力添えよろしくお願いします。
- arata
- ベストアンサー率49% (139/279)
一箇所間違えてました。 reg.Pattern = ".*txt$" は、 reg.Pattern = ".*[tT][xX][tT]$" が正しいので、修正してください。
- poor_Quark
- ベストアンサー率56% (1020/1799)
sedはどうでしょう。
お礼
ご協力有難うございます。 また何かありましたらそのときはよろしくお願いします。
補足
sedでどのような処理を記述すれば良いのでしょうか?
お礼
ご回答有難うございます。 残念ながらMSWORDを所有しておりませんので上記スクリプトを使用することが出来ませんが、購入する機会がありましたらその際には利用させていただきたいと思います。