ファイルをダウンロードしたらzipなんてことは多いですよね。解凍したいですね。
というわけで、ZIP UDFがありますが、ちょっと使っているとパスワードかかっているzipに対応していないようで、それを改良した_ZIP UDFをwraithduさんが作っています。(2013年更新版)
しかし、パスワードダイアログが出るなど自動化したいのにそこ出るの!ということになります。
探していると、7Zip UDFがパスワードも引数に指定して解凍できるなど便利そうなので紹介します。
1. 7Zip UDFを使う
下記のフォーラムでも同じこと考えているようで、結果7Zip UDFが解凍時パスワード機能があるようなので、それに従ってみます。というかZIP UDFはzipfldr.dllを使っているのですが、APIが公開されていないとのことで、引数にパスワードを、ということが出来ません。(誰か出来たら教えていただければ!)
普通にパスワード付きzipファイルを解凍するとパスワード確認ダイアログが出てきます。まぁこのウィンドウを監視してパスワード入力するようにすればいいのですが、あまりいい方法ではありません。
1.1 7Zip UDFはリンク切れなので注意。下記でダウンロード
下記のフォーラムにもあるように、リンク切れなので、Rogue5099氏が教えてくれたリンクをクリックしzipファイルをダウンロード・展開します。
Rogue氏が提供しているリンクはこちら。zipファイルの中に7Zip UDFや7zip.dllが入っています。
ダウンロードしたzipを展開すると以下が入っています。

1.2 7-zip.dllの最新版をダウンロード
7-zip32.dll,7-zip64.dllが入っていますが、ちょっと信用できないな・・という人はそれぞれダウンロードしましょう。32bitは統合アーカイバプロジェクトから、64bitは以下から
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テキストファイルは削除しておきましょう。

3. 実行してパスワードzipの解凍を確認
実行してみます。successと出れば、txt.txtが出来ていると思います。いいですね。

リストデータ読み込んで、パスワード付きのをどんどん解凍していくなんてもの出来ますね。
もしくはパスワードわからない時に適当なパスワードを生成し渡していけばいつか解凍できますね。
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をダウンロードすると入っています)を読むとパラメータについて記載されています。
コメント