WSHでお遊び♪

大山くんより「どれだけ大変な思いをしながらやってきたのかを隠さずに、昔のレポートも全部公開しておくべし!」という指摘があり、しぶしぶ昔のレポートをサーバーに上げました。

UPしたURLは↓です

http://mizunarano-mori.info/members_only/blog/pplog.php

 

capture.jpg

ところが、当初作成したときのフォルダのパスが異なってしまっているので、画像が表示されなかったり、PHPがちゃんと動作しない箇所がでてきてしまいました。

ファイルの中身を調べてみると、URLがやはり違う場所を指してしまっています。

現状のアドレスに合うように、これらをひとつひとつ全部修正すればちゃんと動くようになるのですけど、ファイルの数は3000個近くあります。

folder.jpg

3000個近いファイルをひとつひとつテキストエディタで開いて手作業で修正するには、膨大な時間と労力を要しますし、今後同じような修正をしなくちゃならない場合も出てくるかもしれません。

んで、誠に不本意ながらもお遊びで「仕事で使っているワザ」をちょっとだけ使っちゃいました。


休みの日にまでこんなことやりたくねーよ...(Θ。Θ)


WSHとはWindowsスクリプティングホストの略で、Windows上でJavaScriptやVBScriptで記述されたスクリプトを実行するためのソフトウェアです。パソコンのOSがWindowsだったら標準で装備されています。

今回はバッチファイルでVBScriptで書いたプログラム本体を呼んで処理を実行するというスクリプトを書きました。

■起動方法

changedir.bat [検索フォルダ名] [検索対象語句] [置換語句]

■引数の意味

[検索フォルダ名] 入力したフォルダ配下にある全ファイルを検索します。

[検索対象語句] ファイルの中に記述されている語句のうち、違う語句に置き換えたい語句

[置換語句] 検索対象語句から置き換えたい語句

■対象ファイル
*.php,*.html,*.shtml,*.xml,*.rdf,*.tmp

※かなり汎用性が高いですけど、上記の拡張子にしか対応させていません。

興味のある方は、自分でどんどん書いてみてはいかがでしょうか?

WSHやVBScriptの詳細についてはMSDN Library http://www.microsoft.com/japan/msdn/ に掲載されています。


■repchr.bat

SETLOCAL

@ECHO 一括置換バッチファイル

@CALL cscript repchr.vbs %1 %2 %3


■repchr.vbs

option explicit

If WScript.Arguments.Count > 3 Or WScript.Arguments.Count < 3 Then
    WScript.StdOut.WriteLine "パラメータの数が合ってません"
    WScript.StdOut.WriteLine "使用方法"
    WScript.StdOut.WriteLine "changedir.bat [検索フォルダ名] [検索対象語句] [置換語句]"
    WScript.Quit(1)
End If

Dim sPh,sPr,repP,regP
sPh = WScript.Arguments(0)
regP = WScript.Arguments(1)
sPr = WScript.Arguments(1)
repP = WScript.Arguments(2)

Call prcMkReg
Call prcRepFiles

WScript.Quit(0)

Private Sub prcMkReg()
    Dim c,tmpS
    c = 0
    For c = 1 To Len(sPr)
        If Mid(sPr,c,1) = "/" Or Mid(sPr,c,1) = ":" Then
           tmpStr = tmpS & "\" & Mid(sPr,c,1)
        Else
           tmpS = tmpS & Mid(sPr,c,1)
        End If
    Next
    regP = tmpS & ".*"
End Sub

Private Sub prcRepFiles()

    Dim wSh,wEx,pLst
    Set wSh = CreateObject("WScript.Shell")
    Set wEx = wSh.exec("%ComSpec% /c ""dir /S /B " &  sPh )
    pLst = wEx.StdOut.ReadAll
    Set wEx = Nothing
    Set wSh = Nothing

    Dim pAr,aC,tPath
    pAr = Split(pLst,vbCrLf)
    aC = 0
    Dim rEx, mT, mTes
    Set rEx = New RegExp
    rEx.Pattern = "(?:\.php|\.html|\.shtml|\.xml|\.rdf|\.tmpl)$"
    rEx.IgnoreCase = True
    rEx.Global = True

    For aC = LBound(pAr) To UBound(pAr)
        tPath = pAr(aC)
        Set mTes = rEx.Execute(tPath)
        For Each mT in mTes
            WScript.StdOut.WriteLine tPath
            Call prcRepP(tPath)
            Exit For
        Next
    Next

    Set rEx = Nothing
End Sub

Private Sub prcRepP(ByVal cP)

    Err.Number = 0
    Dim oFs,oF
    Set oFs = CreateObject("Scripting.FileSystemObject")
    Set oF = oFs.OpenTextFile(cP,1,False)

    If Err.Number > 0 Then
        Exit Sub
    End If

    Dim rEx, mT, mTes
    Set rEx = New RegExp
    rEx.Pattern = sPr
    rEx.IgnoreCase = True
    rEx.Global = True

    Dim tL,wStr,repFlg,cnt
    wStr = ""
    cnt = 0
    repFlg = False

    Do Until oF.AtEndOfStream
        tL = oF.ReadLine
        Set mTes = rEx.Execute(tL)
        For Each mT in mTes
            repFlg = True
            tL =  Replace(tL,sPr,repP)
        Next
        wStr = wStr & tL & vbCrLf
    Loop

    oF.Close
    Set oF = Nothing
    Set oFs = Nothing

    If repFlg = True Then
        Call  prcReplaceFile(cP,wStr)
    End If

End Sub

Private Sub prcReplaceFile(ByVal cP, ByVal wStr)

    Err.Number = 0

    Dim oFs1,oF1
    Set oFs1 = CreateObject("Scripting.FileSystemObject")
   
    If oFs1.FileExists(cP & ".sv")  = True Then
        Dim oFs2, oF2
        Set oFs2 = CreateObject("Scripting.FileSystemObject")
        Set oF2 = oFs2.GetFile(cP & ".sv")
        oF2.Delete
        Set oFs2 = Nothing
        Set oF2 = Nothing
    End If

    Set oF1 = oFs1.GetFile(cP)
    oF1.Move cP & ".sv"
    If Err.Number > 0 Then
        Exit Sub
    End If
       
    Set oF1 = Nothing
    Set oFs1 = Nothing


    Dim oFs3,oF3
    Set oFs3 = CreateObject("Scripting.FileSystemObject")
    Set oF3 = oFs3.OpenTextFile(cP, 2, True)

    If Err.Number > 0 Then
        Exit Sub
    End If

    oF3.WriteLine wStr
    oF3.Close
    Set oF3 = Nothing
    Set oFs3 = Nothing

    Dim oFs4, oF4
    Set oFs4 = CreateObject("Scripting.FileSystemObject")
    Set oF4 = oFs4.GetFile(cP & ".sv")
    oF4.Delete

    Set oFs4 = Nothing
    Set oF4 = Nothing

End Sub


※ご注意
{{{
本スクリプトの使用は無償としますが、再配布の際は著作権情報を明記してください。

⇒ (c)2008 mizunarano-mori.info

本スクリプトの使用によって生じた如何なる損害に対する責任は使用したご本人が負うものとします。

最近の記事


[BACK|NEXT |RDM |LIST]
© 2000-2008 mizunarano-mori.info. All rights reserved.
  上州屋飯能店のブログをサポート中