2019年11月15日

バッチファイルで複数のフォルダをzipに圧縮する


バッチファイルを使ってフォルダを圧縮する方法をメモメモ…



複数のフォルダをそれぞれ個別に zip ファイルとして圧縮したい場合の対処法です。たとえば FolderA と FolderB と FolderC という名前の3つのフォルダがあったときに、FolderA.zip と FolderB.zip と FolderC.zip を作成する方法ですね。3つくらいなら手動でなんとかなりますが、これが10個、20個…となった場合はさすがに自動化が必要です。今回はバッチファイルを使って実現してみます。

ちなみに、ただ単に複数フォルダを1つのzipにまとめたいのであれば、フォルダをすべて選択した状態で、エクスプローラ上部のメニューから「共有」タブ > Zip を押すだけ(Windows10の場合)で済みます。


注意点


バッチファイル(.bat)は複数のファイルやフォルダに対して処理を行うのにとても便利なのですが、使い方を間違うとファイルが消失するなど意図しない結果になる可能性もあります。手順をよく読み、バッチファイルの仕様やコマンドの処理内容をできるだけ理解してから実行するようにしてください。自己責任でお願いします。

また、今回の方法では 7-Zip がインストールされていることが前提なので注意してください。


バッチファイルの作成方法


というわけでさっそくバッチファイルを作ります。
  1. テキストドキュメントを新規作成する
    適当なフォルダ内で右クリック→新規作成→テキストドキュメントと選択していけばOK。ファイル名は何でも構いません。
  2. 作成したドキュメントをテキストエディタで開く
    「メモ帳」で十分です。
  3. 次のコマンドを入力(コピペ)する
    for /d %%F in (%*) do "C:\Program Files\7-Zip\7z.exe" a "%%~F.zip" "%%~F\"
    
    "C:\Program Files\7-Zip\7z.exe" の部分は 7-Zip がインストールされている場所を指定してください。インスト―ル場所を変更した覚えがなければそのままで大丈夫です。
  4. 保存する
  5. 拡張子を .txt から .bat に変更する

細かく書きましたが、要はテキストファイルに上記のコマンドを書いて .bat ファイルとして保存するだけです。10秒で終わります。


バッチファイルの使い方


これで準備は整いました。使い方は簡単です。対象となるフォルダをすべて選択した状態で、それらを先ほど作成したバッチファイルの上にドラッグ&ドロップするだけです。コマンドプロンプトが開き、自動的に圧縮が始まります。zip ファイルが作成される場所はもとのフォルダのある場所です(もとのフォルダは削除されずそのまま残ります)。

フォルダを選択してD&Dするだけ(バッチファイルは同じ場所になくてもOK)

一度バッチファイルさえ作っておけば使いまわせるので便利ですね。


コマンド解説


今回作成したバッチファイルの中身のコマンドについても一応簡単に触れておきます。

for /d %%F in (%*) do "C:\Program Files\7-Zip\7z.exe" a "%%~F.zip" "%%~F\"

基本的には for ループを利用して「対象のフォルダすべてに対して 7z.exe を実行する」という処理をしているだけです。構文は次のようになります。

for オプション %%変数名 in (対象ファイル) do 実行したいコマンド

オプション:対象となるファイルの種類などを指定できるオプションです。たとえば今回指定した /d は「ファイルではなくフォルダ(ディレクトリ名)を対象にする」という意味。ほかにも /r/l/f などがあります。

変数名:処理対象のファイルが格納される変数です。アルファベット1文字で指定します。たとえば %%F という変数で FolderA という名前のフォルダを処理するとき、"%%F.zip" という文字列は "FolderA.zip" として読み取られます。ただし、このままだとフォルダ名にスペース(空白文字)が入っている場合マズいことになるので、"%%F.zip" ではなく "%%~F.zip" のようにチルダ(~)を間に入れています(詳しくはこちらを参照)。

対象ファイル:対象となるファイルやディレクトリです。*? などのワイルドカードが使えます。たとえば (*) と書くと「現在のディレクトリにあるすべてのファイル」が対象になります。(F*) とすれば「ファイル名がFから始まるすべてのファイル」、(*.txt) なら「すべてのテキストファイル」というふうに指定できます。今回使った (%*) というのは「コマンドに渡されたすべての引数」…つまり「このバッチファイルの上にドロップされたすべてのファイル」を指します。


もう少し詳しく知りたい方やバッチファイルについてイチから学びたい方は次のページが参考になると思います。

【bat】Windowsのバッチファイル(*.bat)の書き方自分用まとめ - Qiita
.bat(バッチファイル)のforコマンド解説。 - Qiita

0 件のコメント:

コメントを投稿