【7zip自動化】GUI操作はもう卒業!パスワード付き圧縮・解凍を爆速にする方法

皆さん、日々の業務でファイルの圧縮や解凍、どうしていますか?
「右クリックして、7zipを選んで、パスワードを入力して…」
この数秒の操作、積み重なると意外と大きな時間を奪っていることに気づいていますか?

私はエンジニアとして効率を何よりも大切にしています。
今回は、そんな「地味に面倒な7zip操作」をPythonとバッチファイルで徹底的に自動化した話を共有します!


概要〜なぜ自動化が必要なのか〜

日々の業務、特にプロジェクト管理や資料送付で避けて通れないのが「パスワード付きZIP」の作成です。
毎回同じようなパスワード(例えば ABC202603 のような日付入り)を手で入力していませんか?

  • GUIを立ち上げるのが面倒
  • パスワードの打ち間違いが発生する
  • ファイル名から .txt を消して .zip に変えるのが地味にストレス

これらの課題を解決するために、「ファイルをバッチに落とすだけ」で完了する仕組みを作りました。
これで、本来集中すべき「クリエイティブな仕事」に時間を使えるようになります。

出来るようになること

  • 年月/年月日パスワードの自動生成: ABC202603 などのパスワードを自動で付与。
  • 手入力パスワードのプレフィックス対応: ABC + 自分の好きな文字 で柔軟に対応。
  • ファイル名の自動クレンジング: test.txt を落とせば test.zip が出来上がる。
  • ドラッグ&ドロップ操作: フォルダを開いて落とすだけ。GUI操作ゼロへ。

仕組みの解説

今回のツールは、Pythonを核にして、設定ファイル(JSON)とバッチファイルで構成しています。

config.jsonで設定を管理

7zipの実行パスや、パスワードの固定部分(プレフィックス)を外出しにしています。

{
    "seven_zip_path": "C:\\Program Files\\7-Zip\\7z.exe",
    "password_prefix": "ABC"
}

Pythonスクリプトのコアロジック

datetime モジュールを使って、動的にパスワードを生成しています。
また、os.path.splitext を使うことで、ファイル名から不要な拡張子を除去する工夫も入れています。

def generate_password(self, mode):
    now = datetime.now()
    if mode == "monthly":
        return f"{self.prefix}{now.strftime('%Y%m')}"
    elif mode == "daily":
        return f"{self.prefix}{now.strftime('%Y%m%d')}"
    # ...

ドラッグ&ドロップ用バッチファイル

ここが一番のポイントです。バッチファイルを作ることで、Pythonを意識せずに使えます。

@echo off
set PREFIX=ABC
pushd %~dp0
python 7z_automation.py compress monthly %1 %PREFIX%
pause
popd

このバッチにファイルをポイッとするだけ。快感です。

PREFIX はたぶん様々なルールがあると思うのでプロジェクトごと変更するイメージです。
compress の指定で圧縮操作、decompress の指定で解凍操作です。
monthly の指定で「ABC」のプレフィックス+YYYYMM(年月)形式になります。
daily の指定でプレフィックス+YYYYMMDD(年月日)形式になります。

4 ソースコード全文

セキュリティのため、絶対パスなどの環境依存情報はマスクしています。ご自身の環境に合わせて適宜書き換えてください。

config.json

7zip本体のパスとパスワードの固定部分を設定します。

{
    "seven_zip_path": "C:\\Program Files\\7-Zip\\7z.exe",
    "password_prefix": "ABC"
}

7z_automation.py

圧縮・解凍のコアロジックです。

import os
import sys
import subprocess
import json
from datetime import datetime

class SevenZipAutomation:
    def __init__(self, config_path="config.json"):
        with open(config_path, "r", encoding="utf-8") as f:
            self.config = json.load(f)
        self.seven_zip = self.config["seven_zip_path"]
        self.prefix = self.config["password_prefix"]

    def generate_password(self, mode):
        now = datetime.now()
        if mode == "monthly":
            return f"{self.prefix}{now.strftime('%Y%m')}"
        elif mode == "daily":
            return f"{self.prefix}{now.strftime('%Y%m%d')}"
        elif mode == "custom":
            val = input(f"Enter password suffix (prefix is '{self.prefix}'): ")
            return f"{self.prefix}{val}"
        else:
            raise ValueError("Invalid password mode")

    def run_command(self, args):
        print(f"Executing: {self.seven_zip} {' '.join(args)}")
        result = subprocess.run([self.seven_zip] + args, capture_output=True, text=True)
        if result.returncode != 0:
            print("Error occurred:")
            print(result.stderr)
        else:
            print("Operation completed successfully.")
        return result.returncode

    def compress(self, target_path, mode):
        password = self.generate_password(mode)
        # 圧縮ファイル名の生成 (元の名前から拡張子を除いたもの.zip)
        if os.path.isfile(target_path):
            base_name = os.path.splitext(os.path.basename(target_path))[0]
        else:
            base_name = os.path.basename(target_path.rstrip(os.sep))

        output_name = f"{base_name}.zip"
        output_path = os.path.join(os.path.dirname(target_path), output_name)

        args = ["a", output_path, target_path, f"-p{password}"]
        return self.run_command(args)

    def decompress(self, archive_path, mode):
        password = self.generate_password(mode)
        output_dir = os.path.join(os.path.dirname(archive_path), os.path.splitext(os.path.basename(archive_path))[0])
        args = ["x", archive_path, f"-o{output_dir}", f"-p{password}", "-y"]
        return self.run_command(args)

if __name__ == "__main__":
    if len(sys.argv) < 4:
        print("Usage: python 7z_automation.py <compress|decompress> <mode:monthly|daily|custom> <target_path> [prefix]")
        sys.exit(1)

    action = sys.argv[1]
    pw_mode = sys.argv[2]
    target = sys.argv[3]

    automation = SevenZipAutomation(os.path.join(os.path.dirname(__file__), "config.json"))

    if len(sys.argv) >= 5:
        automation.prefix = sys.argv[4]

    if action == "compress":
        automation.compress(target, pw_mode)
    elif action == "decompress":
        automation.decompress(target, pw_mode)
    else:
        print("Invalid action")

バッチファイル(例:zip_monthly.bat)

ドラッグ&ドロップで使うためのバッチファイルです。

@echo off
set PREFIX=ABC
pushd %~dp0
python 7z_automation.py compress monthly %1 %PREFIX%
pause
popd

バッチファイル(例:unzip_monthly.bat)

解凍用のバッチファイルです。

@echo off
set PREFIX=ABC
pushd %~dp0
python 7z_automation.py decompress monthly %1 %PREFIX%
pause
popd

まとめ

いかがだったでしょうか?
「たかが数秒」の効率化ですが、プロのエンジニア・ブロガーとしては、こういった小さな積み重ねが「月間数万ビューを支えるアウトプット」を生むための余裕を作ってくれると信じています。

皆さんもぜひ、自分の手になじむツールを作って、単調な作業から自分を解放してあげてください!

〇明日からできる具体的な行動

  • 自分が1日に何度「同じ操作」をしているか数えてみる
  • その操作を「1クリック」または「ドラッグ&ドロップ」にできないか考えてみる
  • 今回のスクリプトを自身のプロジェクトに合わせてカスタマイズしてみる

これからも「時間の重要性」を意識して、楽しくハックしていきましょう!(^^)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です