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