VBScript+bat+7zipでフォルダ毎に圧縮

  • 投稿日:
  • by
  • カテゴリ:
  • |
複数のファルダをバッチにドラッグアンドドロップ(以下D&D)してループで一つずつ圧縮するのは、上手くいったんだけど、大量(1300個程)にD&Dしたら「ファイル名または拡張子が長すぎます。」ってエラー出た。

なので、VBScriptでVBSファイルを置いてるフォルダ内のフォルダを一個ずつバッチに渡すのを作った(初めてVBScriptを使ったので死ねた)
まぁ、50個ずつD&Dでやれなくはなかったけど、どう考えても面倒だった(VBScriptもワケワカメで面倒だったが)

とりあえず備忘録に置いておく

バッチファイル(拡張子bat)(zip.batとか)
@echo off
cd /d "%~dp0"

:LOOP
if "%~1"=="" goto last
set FILE="%~1"
set OUT="%~1.zip"
echo ---------------------------------------------------
echo Start %time%
echo %FILE%の圧縮
"C:\Program Files\7-Zip\7z.exe" a %OUT% %FILE% -xr!Thumbs.db -mx=9 -mm=LZMA -md=64m -mfb=64 -mmt=6
echo End %time%
echo ---------------------------------------------------
shift
goto LOOP

:last

一応これにファイルとかフォルダとかまとめてD&Dすれば、同じ位置にzipが出来る
7z.exeのパス(赤字)は自分の環境に合わせて変更、オプションはhttp://yuichi.tea-nifty.com/blog/2009/04/7-zip-fb3f.htmlとか参考にすればいい

VBScriptファイル(拡張子vbs)(zip.vbsとか)
Option Explicit

Dim fso, folder, wShell, subFolder, path

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(".")
Set wShell = WScript.CreateObject("WScript.Shell")
filelist(folder)

Sub filelist(folder)

For Each subFolder In folder.subFolders
path = """" & subFolder.Path & """"
wShell.Run "C:\bat\zip.bat " & path,0,True
Next

Msgbox "完了しました"

End Sub

バッチファイルのパス(赤字)も自分の環境に合わせて変更。
"C:\bat\zip.bat "の最後の半角スペースは無いとエラー出る
色々見て回ってツギハギで作ったから滅茶苦茶かも......
とりあえず動きゃOKかな

使い方は、バッチファイルはどこか適当に置いておいて、VBSファイルは圧縮したいフォルダと同じフォルダに置いて、VBSファイルをダブルクリック

VBScriptで何をやってるかも、今後の為に簡単に書いておくか一応(あんまり使う機会なさそうだけど)
流れはスクリプトファイルを置いたフォルダ内のファイル・フォルダを取得して、
フォルダのみをループでバッチファイルに一個ずつ渡して、7zipで圧縮

GetFolder(".")でフォルダ内のファイル・フォルダを取得
.subFoldersでフォルダのみ(これってもしかしてサブフォルダ全部取得しちゃうのかな?)
"""" & subFolder.Path & """"(半角スペース対策にダブルクォーテーションで括る)
wShell.Run "C:\bat\zip.bat " & path,0,True(pathはバッチに渡す引数、0はコマンドウィンドウ非表示、Trueはバッチ終了待ち)



もしかしたら、この位の事、探せばあるんじゃないかと思う。
まぁ、なんにせよ、コレと似たような事したい人はいるだろうから、もしかしたら誰かの役に立つのかもしれない。