AutoItでZipファイルへ圧縮、解凍するには7zip UDFがパスワード付きも引数で可能

7zip udf autoit ブログ

ファイルをダウンロードしたらzipなんてことは多いですよね。解凍したいですね。
というわけで、ZIP UDFがありますが、ちょっと使っているとパスワードかかっているzipに対応していないようで、それを改良した_ZIP UDFをwraithduさんが作っています。(2013年更新版)
しかし、パスワードダイアログが出るなど自動化したいのにそこ出るの!ということになります。
探していると、7Zip UDFがパスワードも引数に指定して解凍できるなど便利そうなので紹介します。

スポンサーリンク

1. 7Zip UDFを使う

下記のフォーラムでも同じこと考えているようで、結果7Zip UDFが解凍時パスワード機能があるようなので、それに従ってみます。というかZIP UDFはzipfldr.dllを使っているのですが、APIが公開されていないとのことで、引数にパスワードを、ということが出来ません。(誰か出来たら教えていただければ!)
普通にパスワード付きzipファイルを解凍するとパスワード確認ダイアログが出てきます。まぁこのウィンドウを監視してパスワード入力するようにすればいいのですが、あまりいい方法ではありません。

Zip password - extract
Does anyone Know if its possible to extract a zip file with a password? Winrar (.rar) is a alternative too that I can use.

1.1 7Zip UDFはリンク切れなので注意。下記でダウンロード

下記のフォーラムにもあるように、リンク切れなので、Rogue5099氏が教えてくれたリンクをクリックしzipファイルをダウンロード・展開します。

7Zip

Rogue氏が提供しているリンクはこちら。zipファイルの中に7Zip UDFや7zip.dllが入っています。

403 Forbidden

ダウンロードしたzipを展開すると以下が入っています。

7Zip UDFをダウンロードし解凍した

1.2 7-zip.dllの最新版をダウンロード

7-zip32.dll,7-zip64.dllが入っていますが、ちょっと信用できないな・・という人はそれぞれダウンロードしましょう。32bitは統合アーカイバプロジェクトから、64bitは以下から

Common Archivers Library: 7-ZIP32.DLL
Common Archivers Library: 7-ZIP32.DLL
MarleySoft - WIN32 Utilities

2. 適当な場所に置いてパスワード付きzipの解凍スクリプトのコンパイルまで

テキストファイルをメモ帳などで作り、zip圧縮したものを用意します。今回はtxt.txtをzip圧縮でtxt.zipにしました。explzhでパスワード付きにし、パスワードをcfautogにしています。
autoitスクリプトも下記のように用意します。
64bitOSでない場合は最初の3行は必要ありません。SciTEでCtrl+F7でx64にチェックすると挿入される定義です。
7Zip.au3 UDFはどこに置いてもOKです。

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseX64=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include "..\udfs\7Zip.au3"

;zipファイルを指定
Local $arcfile = @ScriptDir & "\txt.zip"
;解凍先ディレクトリを指定
Local $outDir = @ScriptDir

;パスワードを指定
Local $spass = "cfautog"

$ret = _7ZIPExtract(0,$arcfile, $outDir, 1,0,0,0,0,0,0,$spass)
If @error Then 
  MsgBox(0,"error", "error..")
Else
  MsgBox(0,"success", "success")
EndIf

2.1 スクリプトとその他ファイル

コンパイル時に、スクリプトと同じ階層に7-zip32.dll, 7-zip64.dllがないとコンパイルで失敗しまました。なので以下のようになりました。
ちなみに$outDir=@ScriptDirにしているので、txt.txtテキストファイルは削除しておきましょう。

7zip UDFをautoitで使う。パスワード付きzipも解凍可能

3. 実行してパスワードzipの解凍を確認

実行してみます。successと出れば、txt.txtが出来ていると思います。いいですね。

autoit 7zip udfでパスワード付きzipファイルを解凍できました。

リストデータ読み込んで、パスワード付きのをどんどん解凍していくなんてもの出来ますね。
もしくはパスワードわからない時に適当なパスワードを生成し渡していけばいつか解凍できますね。

4. 7-zip.dllを違うディレクトリに入れておきたい場合

とは言え、exeと同じ階層にdllがあるのもなんかなーと思います。
コンパイル時に7-zip32.dll、7-zip64.dllがau3と同じ階層にあればいいだけです。
#include “7Zip.au3” の後に、以下の1行でdllのディレクトリを指定します。
SciTEから実行時は7Zip.au3 L.68 にあるように$sNoCompiledPath = @ScriptDir & “\” です
出来たexeから実行時は$sCompiledPath = です

; exeディレクトリにdllディレクトリを追加しその中にdllを入れる
$sNoCompiledPath = @ScriptDir & "\dll\"
$sCompiledPath = @ScriptDir & "\dll\"

コンパイル時に同じ階層にdllを置いておき、コンパイル成功したら同じ階層にある7-zip32.dll, 7-zip64.dllを削除して実行してみましょう。
successと出ると思います。

5. _7ZIPExtract()関数

引数がたくさんありますが、指定するの面倒なら引数の順番、デフォルト値を変更しておけばいいと思います。0は何もしない

  • $hWnd ウィンドウハンドル
    不要なら0
  • $sArcName アーカイブファイルパス
  • $sOutput 出力ディレクトリパス
    最後は\いらない
  • $sHide Callback関数呼びたいなら0以外
    0にすると処理中のウィンドウが出てきます。
  • $sOverwrite 0=上書き
    1=存在するなら解凍スキップ
    2=解凍ファイルをリネーム _1.extのように数字が付く
    3=存在するファイルをリネーム
  • $sRecurse 0=再帰しない
    1=再帰する
  • $sIncludeArc アーカイブ名を含ませるか 0=しない
  • $sExcludeArc アーカイブ名を除外するか 0=しない
  • $sIncludeFile
  • $sExcludeFile
  • $sPassword
  • $Yes

6. 圧縮は7Zip.au3を修正する必要がある

関数は_7ZipAdd()です。パスワードなしだと普通に圧縮できるのですが、パスワードを指定するとエラーが起きます。
L.205付近の If $sPassword Then $iSwitch &= ” -p” & $sPassword & ‘ -mhe’
ん?-mheってなんですかね?
ということで原因はこれです。
で7z用であって、zip用ではないのです。

; If $sPassword Then $iSwitch &= " -p" & $sPassword & ' -mhe'
If $sPassword Then $iSwitch &= " -p" & $sPassword  

7. パスワード付きzipを作ってみる

以下のコードでとりあえず出来ます。

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseX64=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include "..\udfs\7Zip.au3"

Local $arcname = @ScriptDir & "\arc.zip"
Local $filename = @ScriptDir & "\*.au3"
Local $spass = "cfautog"
$ret = _7ZipAdd(0,$arcname, $filename, 0,5,1,0,0,$spass)
If @error Then 
  MsgBox(0,"error", "error")
Else 
  MsgBox(0,"success", "success")
EndIf

8. _7ZipAdd()関数

こちらも引数たくさんあります。

  • $hWnd ウィンドウハンドル 0
  • $sArcName 圧縮後のファイル名 フルパスでも名前でも
  • $sFileName 圧縮したいファイル。ワイルドカードも利用可能
  • $sHide 1なら処理中のウィンドウが出なくなる
  • $sCompress 圧縮レベル
    0,1,3,5,7,9を指定できるっぽい
  • $sRecurse = 1
  • $sIncludeFile 含めるファイル。
    $sFileNameでディレクトリしか指定しない場合、含めるファイルをここに記載
  • $sExcludeFile 含めないファイル *.dll だと含めない
  • $sPassword パスワードを付ける つけない場合=0

細かいパラメータについては7-zipCMD.txt (最新の7zip.dllをダウンロードすると入っています)を読むとパラメータについて記載されています。

コメント

タイトルとURLをコピーしました