Q.
AutoItでzipファイルを作成するスクリプトを教えてください。
A.
AutoIt で ZIP ファイルを作成するには、標準機能では対応していないため、外部のDLL(例えば Windows の Shell.Application
を使った方法)や、7-Zip のようなコマンドラインツールを組み合わせるのが一般的です。
ここでは、以下の2つの方法を紹介します。
■ 方法①:Windowsの Shell.Application
を使う(簡易的なZIP作成)
この方法では、フォルダをZIPに変換できますが、細かい設定や圧縮レベル指定などはできません。
Func CreateZipUsingShell($zipFilePath, $sourceFolder)
; 空のZIPファイルを作成
Local $zipHeader = "PK" & Chr(5) & Chr(6) & StringRepeat(Chr(0), 18)
Local $file = FileOpen($zipFilePath, 2 + 16) ; overwrite + binary
FileWrite($file, $zipHeader)
FileClose($file)
; Shell.Applicationで圧縮
Local $objShell = ObjCreate("Shell.Application")
Local $objSource = $objShell.NameSpace($sourceFolder)
Local $objDest = $objShell.NameSpace($zipFilePath)
$objDest.CopyHere($objSource.Items(), 20) ; 20 = Do not show progress dialog
; コピー完了まで待機(必要に応じて調整)
Sleep(3000)
EndFunc
; 使用例
CreateZipUsingShell("C:\Temp\sample.zip", "C:\Temp\folder_to_zip")
■ 方法②:7-Zip を使う(高機能・推奨)
7-Zip をインストールまたはポータブル版を使い、AutoIt からコマンドラインで呼び出します。
Func CreateZipUsing7Zip($zipFilePath, $sourceFolder, $sevenZipPath = "C:\Program Files\7-Zip\7z.exe")
Local $cmd = '"' & $sevenZipPath & '" a -tzip "' & $zipFilePath & '" "' & $sourceFolder & '\*"'
RunWait(@ComSpec & " /c " & $cmd, "", @SW_HIDE)
EndFunc
; 使用例
CreateZipUsing7Zip("C:\Temp\sample.zip", "C:\Temp\folder_to_zip")
補足:
- 方法①は外部ツール不要で手軽ですが、大量ファイルや大容量だと不安定なことがあります。
- 方法②は7-Zipの導入が必要ですが、信頼性・圧縮率・速度すべてで優れています。
どちらの方法を使いたいですか?それとも他の条件に合う方法が必要ですか?
Q.
7-zipにしたいと思います。圧縮の対象はフォルダではなく、異なるフォルダにある2つのファイルにしたいのですが、コマンド内にファイルパスを列挙する方法はありますか。それともリストファイルを作ってそれを指定した方が一般的ですか。
A.
了解です!以下は、readme.txt
(固定)と、D&Dで受け取った**イメージファイル(1つ)**をZIPに圧縮する、コマンド列挙型のAutoItスクリプトです。
✅ AutoItスクリプト:D&Dで渡されたファイル + readme.txt を圧縮
; 7-Zip のパスを指定(必要に応じて変更)
Global $sevenZipPath = "C:\Program Files\7-Zip\7z.exe"
; readme.txt の固定パス(必要に応じて変更)
Global $readmePath = "C:\your\path\to\readme.txt"
; 出力ZIPファイルのパス(ここではスクリプトと同じ場所に出力)
Global $zipOutputPath = @ScriptDir & "\archive.zip"
; D&Dされたファイルを取得
If $CmdLine[0] < 1 Then
MsgBox(48, "エラー", "イメージファイルをスクリプトにドラッグ&ドロップしてください。")
Exit
EndIf
; 対象ファイル(readmeとD&Dファイル)をまとめる
Local $filesToZip[2]
$filesToZip[0] = $readmePath
$filesToZip[1] = $CmdLine[1] ; 最初のD&Dファイルのみ使用
; コマンドを作成
Func CreateZipWithFiles($zipFilePath, $sevenZipPath, $fileList)
Local $cmd = '"' & $sevenZipPath & '" a -tzip "' & $zipFilePath & '"'
For $i = 0 To UBound($fileList) - 1
$cmd &= ' "' & $fileList[$i] & '"'
Next
RunWait(@ComSpec & " /c " & $cmd, "", @SW_HIDE)
EndFunc
; 実行
CreateZipWithFiles($zipOutputPath, $sevenZipPath, $filesToZip)
MsgBox(64, "完了", "ZIPファイルが作成されました:" & @CRLF & $zipOutputPath)
🔧 調整ポイント
readmePath
にあなたのreadme.txt
の実パスを指定してください。- D&Dファイルは1ファイルのみ処理しますが、複数にも拡張できます。
- 出力先やZIPファイル名も変更可能です。
💡 補足(複数D&D対応版にしたい?)
複数イメージをD&Dして、全部を圧縮したい場合は、少しコードを変えるだけで対応可能です。必要であれば、そのバージョンも作ります!
どうします?
Q.
複数バージョンは必要ないです。ありがとうございました。
了解です!お役に立ててうれしいです😊
もしあとから readme の位置を動かしたり、出力名を自動で変えたくなったりしたら、いつでも相談してくださいね!
他にも AutoIt やスクリプト周りで気になることがあれば、気軽にどうぞ〜!