VSソリューション内のファイルを圧縮してバックアップ

VisualStudioの「ツール」メニューに登録して、そこからバックアップするためのVBScript
VS6の頃も作ってみたもののunlha32.dllとunlha.exeを利用して作ったので、あちこちで使うには不便だった。

その反省を踏まえて、Cabで挑戦

「ツール」メニューから「外部ツール」を選び、追加ボタンを押して

タイトルBackup〜とでも
コマンドcscript.exe
引数BackupFolder.vbs $(SolutionDir) %TEMP% $(TargetName) projdata|ncb
初期ディレクトスクリプトファイルが入っている場所

バックアップファイルの保存先は%TEMP%です。とりあえず。

projdata、ncb(IntelliSense Dababase)は、コピー不可だったのでバックアップ対象からはずしてあります。

VS2002のC#VC++で簡単に試しただけなのでうまくいかないかも・・・

  • さまざまな中間ファイルも除外すべきだなぁ
'BackupFolder.vbs 
' arg(0): 圧縮したいフォルダのパス
' arg(1): 保存先フォルダのパス
' arg(2): 保存する名前
' arg(3): 保存対象からはずす拡張子('|'で区切って複数可)
' 保存するファイル名はyyyymmdd_hhmmssarg(2).cab
'
' 例 >BackupFolder.vbs .\ .\bak AllFiles
'   カレントフォルダのファイルを全て圧縮し、カレントフォルダ下のbakに保存
'   ファイル名は、yyyymmdd_hhmmssAllFiles.cab
' 例 >BackupFolder.vbs C:\Dir C:\bak C_Dir projdata
'   C:\Dirのファイルを全て(*.projdataは除く)を圧縮し、C:\bakに保存
'   ファイル名は、yyyymmdd_hhmmssC_Dir.cab
'option explicit

Set args = WScript.Arguments

'引数
'for each arg in args
'   Wscript.Echo arg
'next

If args.count = 3 Then
    BackupFolderToCab args(0), args(1), args(2), ""
ElseIf args.count = 4 Then
    BackupFolderToCab args(0), args(1), args(2), args(3)
End If


Sub BackupFolderToCab( FolderPath, SavePath, CabName, IgnoreExt )
    Set shl = CreateObject( "WScript.Shell" )
    'ファイル一覧を取得
    Set pipe = shl.Exec( "%comspec%  /c ""dir /s /b /a:-d """ & FolderPath & """ """  )

'    Do While pipe.Status = 0
'        WScript.Sleep 100
'    Loop
    
    Dim regign, cabfiles
    
    ' ファイルを'|'区切りの文字列にする
    If Len(IgnoreExt) <> 0 Then
        Set regign = GetIgnoreExt( split(IgnoreExt,"|") )
        
        Do While  Not pipe.StdOut.AtEndOfStream
            fName =   pipe.StdOut.ReadLine
            If Not regign.Test(fName) Then ' 保存対象から除く
                cabfiles = cabfiles & fName & "|"
            End If
        Loop
    Else
        Do While  Not pipe.StdOut.AtEndOfStream
            cabfiles = cabfiles &  pipe.StdOut.ReadLine & "|"
        Loop
    End If
    
    ' 文字列最後の'|'を削除
    cabfiles = Left( cabfiles, Len(cabfiles ) -1 )

    '保存時間(yyyyMMdd_hhmmss)+CabNameをファイル名とする
    Dim cab 
    cab = SavePath & "\" & _
      ReplaceRegx(CStr(now),"(\d{4})/(\d{1,2})/(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})", "$1$2$3_$4$5$6") & _
      CabName & ".cab"
     
    MakeCabFile cab, split(cabfiles,"|")
    WScript.Echo cab &  "に保存しました"
End Sub


'Cabpath:保存するCabファイル名
'fil:ファイル名を渡す。圧縮したいファイルがひとつの場合は、そのまま文字列を
'    圧縮したいファイル名が複数の場合は、文字列の配列を渡す
' 使い方
' MakeCabFile( "test.cab", split("file1.txt|file2.txt","|") )
Sub MakeCabFile( Cabpath, fil)
    Dim cab, i
    On Error Resume Next
    Set cab = CreateObject("MakeCab.MakeCab.1")
    cab.CreateCab CStr(Cabpath), False, False
    If Err.Number<>0 Then
        If Err.Number = 450 Then
            cab.CreateCab CStr( cabpath ), False, False, False
        Else
            Exit Sub
        End If
    End If
    On Error Goto 0
    If IsArray(fil) Then
        For i = 0 to Ubound(fil)
            WScript.Echo fil(i)
            cab.AddFile CStr( Trim(fil(i)) ), CStr( Trim(fil(i)) )
        Next
    Else
        cab.AddFile CStr( fil ), CStr( fil )
    End If
    cab.CloseCab
End Sub

' Replace関数の正規表現版
Function ReplaceRegx(expression , patrn, replStr)
    Dim regEx              
    Set regEx = New RegExp
    regEx.Pattern = patrn
    regEx.IgnoreCase  = true
    regEx.Global = true
    ReplaceRegx = regEx.Replace(expression , replStr)
End Function

Function GetIgnoreExt( exts )
    Dim reg
    Set reg = new RegExp
    reg.Pattern = ".*\.(?:"
    For Each ext In exts
        reg.Pattern = reg.Pattern &  ext & "|"
    Next
    reg.Pattern = Left( reg.Pattern, Len( reg.Pattern ) -1 )
    reg.Pattern = reg.Pattern & ")$"
    reg.IgnoreCase = false
    reg.Global = True
    
    Set GetIgnoreExt = reg
End Function