min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

Windows 大量のフォルダをパスワード付きzipにコマンド一括圧縮する(echo パスワード| 7z a zip名 対象dir -p)

Windows で仕事をしていて大量のフォルダを一括でパスワード付きzipに圧縮して顧客に納品したいとする。

<やりたいこと>

例)20180101というフォルダを、20180101.zipに圧縮(パスワード:himitu

f:id:min117:20180212004032p:plain

圧縮されたのを開こうとすると

f:id:min117:20180212004115p:plain

パスワードを求められる。

f:id:min117:20180212004325p:plain

てな感じにしたい。

 

 

フォルダ1つ(20180101)だけを圧縮するなら右クリックからやればいいが、

20180102

20180103

20180104 

と続く全てのフォルダをそれぞれzip圧縮したいときは、手作業だと面倒すぎる。

f:id:min117:20180212004032p:plain

※「全てを1つの入れ物(例えば「2018年」というフォルダ)にまとめて、それを圧縮すればいい」という考えもありそうだが、それだとファイルサイズが大きすぎてメール添付ができなくなってしまう。あくまでフォルダ1つ1つを圧縮かけたい。それを、コマンド一発でやりたい。

<やりかた>

まずはコマンドでフォルダ(1つ)をzip圧縮できるようにする。7z(セブンジップ)というフリーソフトを使う。高性能なのに無償提供。作者の天才ぶりがうかがえる。

ダウンロード | 7-Zip

今回はWindows7 32bitなので、32bit版をダウンロードする。落としたら実行するだけでインストーラが走る。

f:id:min117:20180212010640p:plain

インストール先を控えておく。このあとPATHを通すので。通常は

C:¥Program Files(X867-Zip¥

f:id:min117:20180212010342p:plain

インストール完了。

f:id:min117:20180212010338p:plain

PATHを通す。これもコマンドでやってしまう。まずは管理者権限でコマンドプロンプトを起動する。

スタートメニュー → cmdと入力 → 右クリックで「管理者として実行」。

f:id:min117:20180212010921p:plain

setx コマンドで追加するが、1文字でもミスるとWindowsが死ぬ(PATHが壊れる)ので、いったんnotepadにでも打って何度も確認してからコピペでやるほうがよい。

f:id:min117:20180212011519p:plain

「成功:指定された値は保存されました」と出たらうまくいっている。

コマンドプロンプトのウィンドウを閉じてから再度cmdを起動すれば、PATHが通って7zコマンドが使えるようになる。

パスワードなしの単なるzip圧縮なら

   7z a zip名 対象フォルダ名

で圧縮できる。

 

パスワード付きのzipに圧縮するなら

   echo パスワード| 7z a zip名 対象フォルダ名 -p

とする。

パスワードとパイプ文字|の間にスペースをあけないのがコツ。

実際にやってみる。

   echo himitu| 7z a 20180101.zip 20180101 -p

f:id:min117:20180212005846p:plain

うまくいった。これでフォルダ1つだけ(20180101)を、zipに圧縮(20180101.zip)にできた。

開こうとするとパスワードが出て…

f:id:min117:20180212004115p:plain

himitu と入力すると解除できる。7zほんと最高だ。

f:id:min117:20180212013638p:plain

あとはこれをforループで回せば一括で全てのフォルダを圧縮できる。

   for /F %i in ('dir /b') do @echo %i && @echo himitu| 7z a %i.zip %i -p

f:id:min117:20180212012721p:plain

完璧。

f:id:min117:20180212014335p:plain

エクスプローラで見てもしっかり圧縮されている。

f:id:min117:20180212013047p:plain

ファイルとフォルダが混在している環境ならif文をつけて「フォルダかどうか」を判定してやるとフォルダだけ決め打ちで圧縮できる。

   for /F %i in ('dir /b') do @echo %i && if %~ai == d-------- ( @echo himitu| 7z a %i.zip %i -p ) else ( echo フォルダではありません )