2015年9月27日日曜日

ファイルD&Dで一括置換vbs

'##文字列削除vbs
'##2015/01/28 author:Tsutomu Sato
'##複数ファイルまたはフォルダをドラッグ&ドロップする事で対象文字列を全て置換するスクリプトです。
'##デフォルトの置換文字列設定はteratermマクロのタイムスタンプ文字列、screenOSおよびCisco IOSの「more」行の削除です。
'##ファイル出力先に同じ名前のファイルが在る場合、同ファイルに置換結果が追記されます。
'##フォルダをドラッグ&ドロップした場合は直下にouputというフォルダが作成され、その中に置換後のファイルが出力されます。
'##
'##※その他の使い方
'##1.「inputRegStrFlag = 1」にすると任意で置換対象、置換後の文字列入力が可能になります。
'##2.出力後のファイル名はオリジナルファイルの拡張子の前に「_OutPut」が挿入された名前になります。
'##    「outFileNameIntStr」の値を任意の文字列にする事で変更可能です。
'変数の宣言を強制
Option Explicit
'変数名(オブジェクト)の宣言
'コマンドライン引数,カウンター,正規表現文字列,置換対象文字列,置換前文字列,置換後文字列,
Dim objArgs,count_I,objRep1,StrData,repTStr1,repTStr2,newStrData,inputRegStrFlag
'ファイルシステムオブジェクト,オリジナルフォルダーオブジェクト,オリジナルファイルオブジェクト
Dim fsObj,objorgFolder,objorgFile
'インプットファイルオブジェクト,アウトプットファイルオブジェクト
Dim InFile,outFile
'変数名の宣言
'オリジナルフォルダー名,オリジナルファイル名,オリジナルファイル拡張子
Dim orgFolder,orgfilePath,orgFileExt
'出力フォルダ名,出力フォルダパス,出力ファイル挿入文字列
Dim outFolder,outFilePath,outFileNameIntStr
'オリジナルフォルダー名配列,オリジナルファイル名配列,オリジナルファイル拡張子配列
Dim orgFolders(),orgfilePaths(),orgFileExts()
'出力フォルダ名配列,出力フォルダパス配列
Dim outFolders(),outFilePaths()
Dim inPut01
'コマンドライン引数からオブジェクトを作成
Set objArgs = WScript.Arguments
 'コマンドライン引数<1の時にエラーを出力して停止。
 If objArgs.Count < 1 then
  MsgBox "スクリプトファイルを直接実行できません。" & vbCr & "置換対象のファイルもしくはフォルダをスクリプトファイルにドラッグ&ドロップして下さい。",0,"ファイル入力エラー"
  WScript.Quit()
 End if
'###↓任意で変更↓###
'正規表現文字列入力フラグ
inputRegStrFlag = 1
'出力ファイル名の挿入文字を指定
outFileNameIntStr = "_OutPut."
'####################
'正規表現オブジェクトの作成
Set objRep1 = New RegExp
objRep1.Pattern = "^\[\w{3}\s\w{3}\s[0-9]{2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}\s\d{4}\]\s|--- more --- {1,}| --More--         "
'正規表現パラメータを指定
objRep1.Multiline = True
objRep1.IgnoreCase = True
objRep1.Global = True

 '正規表現文字列の入力フラグ有無で分岐(デフォルトはteratermのタイムスタンプ文字列を置換)
 If inputRegStrFlag = 1 then
  inPut01 = InputBox("置換対象を検索する文字列を入力してください。"& vbCr &"(正規表現)"& vbCr &"※デフォルト入力はteratermのタイムスタンプ文字列を置換削除","検索文字列入力",objRep1.Pattern)
   If IsEmpty(inPut01) then
    MsgBox "「キャンセル」が押されました。スクリプトを終了します。"
    WScript.Quit
   Elseif inPut01 = "" then
    MsgBox "検索文字列が正しく入力されませんでした。最初から直してください。"
    WScript.Quit
   end if
  objRep1.Pattern = inPut01
  repTStr1 = InputBox("置換後の文字列を入力してください。"& vbCr &"(正規表現)"& vbCr &"※デフォルト入力はteratermのタイムスタンプ文字列を置換削除","置換後文字列入力","")
   If IsEmpty(repTStr1) then
    MsgBox "「キャンセル」が押されました。スクリプトを終了します。"
    WScript.Quit
   end if
 else
  repTStr1 = ""
 End if 
'ファイルシステムオブジェクトの作成
Set fsObj = CreateObject("Scripting.FileSystemObject")
 'フォルダorファイルを調査し処理を分岐
 'フォルダの場合
 If fsObj.FolderExists(objArgs(0)) Then
  If objArgs.Count > 1 then
   MsgBox "1度に処理出来るフォルダは1つです。" & vbCr & "処理を中止します。",0,"ファイル入力エラー"
   WScript.Quit()
  End if
  'コマンドライン引数からフォルダ名を取得
  orgFolder = objArgs(0)
  '出力フォルダパスの作成
  outFolder = orgFolder&"\output"
  'フォルダの有無を調査
  'オリジナルフォルダ配下に「output」フォルダが無い場合の処理
  If fsObj.FolderExists(outFolder) = False Then

   'MsgBox ("「"& outFolder &"」is noting")
 
   '「output」フォルダを作成する。
   fsObj.CreateFolder(outFolder)
  'オリジナルフォルダ配下に「output」フォルダが既にある場合の処理
  Else
  ' MsgBox ("「"&outFolder & "」"& vbCr &" is already exists ")
  End if
  'オリジナルのフォルダオブジェクトを作成(直下のファイルを処理するために必要)
  Set objorgFolder = fsObj.GetFolder(orgFolder)
  'オリジナルフォルダ内のファイル数でループ
  For Each objorgFile In objorgFolder.Files
 
   'オリジナルファイルパスと拡張子を取得
   orgfilePath = fsObj.BuildPath(orgFolder, objorgFile.Name)
   orgFileExt = fsObj.GetExtensionName(orgfilePath)
 
   '出力ファイルのパスと拡張子を作成
   outFilePath = fsObj.BuildPath(outFolder, objorgFile.Name)
   outFilePath = Replace(outFilePath,"." & orgFileExt,outFileNameIntStr & orgFileExt)
 
   'オリジナルファイルの内容を出力先ファイルに書き出す
   Set InFile = fsObj.OpenTextFile(orgfilePath,1)
   StrData = InFile.ReadAll
   InFile.Close
   Set InFile = Nothing
 
   '出力ファイルを作成し、オリジナルファイルの不要な文言を正規表現で置換
   '出力ファイルが存在しない場合に新規でファイルを作成する
   If fsObj.FileExists(outFilePath) = False Then
    Set outFile = fsObj.CreateTextFile(outFilePath,False)
    outFile.Close
   End if
   'オリジナルファイルの文字列を置換して出力ファイルに書き出し
   Set outFile = fsObj.OpenTextFile(outFilePath,8)
   newStrData =  objRep1.Replace(StrData,repTStr1)
   outFile.Write (newStrData)
   outFile.Close
   Set outFile = Nothing
  Next
 Elseif fsObj.FileExists(objArgs(0)) Then
   '動的配列を再定義
   Redim orgFolders(objArgs.Count),orgfilePaths(objArgs.Count),orgFileExts(objArgs.Count),outFolders(objArgs.Count),outFilePaths(objArgs.Count)
   For count_I =0 to objArgs.Count -1
 
   'オリジナルファイルパスと拡張子を取得
   orgfilePaths(count_I) = objArgs(count_I)
   orgFileExts(count_I) = fsObj.GetExtensionName(orgfilePaths(count_I))
 
   '出力ファイルのパスと拡張子を作成
   outFilePaths(count_I) = Replace(orgfilePaths(count_I),"." & orgFileExts(count_I),outFileNameIntStr & orgFileExts(count_I))
 
   'オリジナルファイルの内容を出力先ファイルに書き出す
   Set InFile = fsObj.OpenTextFile(orgfilePaths(count_I),1)
   StrData = InFile.ReadAll
   InFile.Close
   Set InFile = Nothing
 
   '出力ファイルを作成し、オリジナルファイルの不要な文言を正規表現で置換
   '出力ファイルが存在しない場合に新規でファイルを作成する
   If fsObj.FileExists(outFilePaths(count_I)) = False Then
    Set outFile = fsObj.CreateTextFile(outFilePaths(count_I),False)
    outFile.Close
   End if
   'オリジナルファイルの文字列を置換して出力ファイルに書き出し
   Set outFile = fsObj.OpenTextFile(outFilePaths(count_I),8)
   newStrData =  objRep1.Replace(StrData,repTStr1)
   outFile.Write (newStrData)
   outFile.Close
   Set outFile = Nothing
  Next
 End if

0 件のコメント:

コメントを投稿