Finder上で選択中のファイルをあらたに作ったDiskImageに入れてZip圧縮するAppleScriptです。
Script Menuに入れて実行することを前提にして作ってあります。
Google DriveなどのクラウドストレージにAppleScriptアプレットなどの実行ファイルをアップロードすると、バンドルが壊れたり、実行できなくなったりします。
そのため、仕方なくZip圧縮してアップロードしたりするわけですが、どうもZipの中身までGoogle Drive側が内容を展開して確認するらしく、ウィルスと疑われてZip圧縮した実行ファイルをダウンロードできないケースが見られます。
また、.dmgファイルに入れただけでもGoogle Driveが中身をスキャンして実行ファイルに警告を出すとのこと。一般的にはウィルスの拡散を防止する機能として好意的に受け止められるべきものですが、本当にプログラムを受け渡す必要がある場合には、こまった仕様です。
そこで、Diskimageに入れて、本来であればパスワードをつけてZip圧縮したいところですが、取り回しが悪くなるので、パスワードはつけないでアーカイブ化するようにしてみました。
▲Finder上で選択中のファイル(複数可)
▲本Scriptでdmg化してZip圧縮したもの
▲Zipアーカイブを展開してdiskimageファイルをマウントしたところ
本Scriptは、おおよそ自分で組んだ記憶がないのと、プログラムの構造が自分らしくないので、おそらくMacScripter.netあたりで拾ってきたScriptをそのまま使っていたものでしょう。それを一部修正してみました。オリジナルのScriptではFinder上で選択中のフォルダのみ処理するようになっていましたが、実際にはファイルをやりとりしたい(AppleScriptアプレットのケース多し)ので、ファイルをそのままdmg化できるように変更しました(単にフォルダを作成してコピーするだけですが)。
本ScriptはmacOS 10.15Beta1上では、macOS 10.15側にバグがあるため動作しません(POSIX pathへの変換程度でバグを作ってほしくないなー)。
AppleScript名:Finder上で選択中のファイルをDMGに変換して圧縮 v2 |
— – Created by: Takaaki Naganoya – Created on: 2019/06/06 — – Copyright © 2019 Piyomaru Software, All Rights Reserved — use AppleScript version "2.5" use scripting additions use framework "Foundation" property NSUUID : a reference to current application’s NSUUID property deleteV : true –DMG変換後に対象フォルダを削除しない(trueで削除) property zipDmg : true –DMG作成後にZip圧縮する(trueで圧縮+DMG削除) –Finder上の選択項目を取得、選択されていない場合には処理終了 tell application "Finder" set selList to selection as alias list if selList = {} or selList = "" or selList = missing value then activate display dialog "何も選択されていません。" buttons {"OK"} default button 1 with icon 1 return end if end tell –一時フォルダを作って選択中のアイテムをコピー set aUUID to NSUUID’s UUID()’s UUIDString() as text set aTmp to POSIX path of (path to desktop) –macOS 10.15 beta1ではおかしな結果が返ってくる set tmpDir to aTmp & aUUID do shell script "mkdir -p " & quoted form of tmpDir set targFol to (POSIX file tmpDir) as alias try tell application "Finder" duplicate selList to folder targFol end tell on error display dialog "エラー:ファイルのコピー中にエラーが発生" buttons {"OK"} default button 1 with icon 1 return end try set aList to {targFol} tell application "Finder" set dmgList to {} –選択中のアイテムを順次処理するループ repeat with i in aList set the end of dmgList to makeDMGfromFolderAlias(i, "") of me –パスワードは付けない –処理後のフォルダを削除する処理 if (deleteV as boolean) = true then deleteFolderItself(i) of me else –元フォルダを削除しない場合、元フォルダの名前を変更する tell application "Finder" set aName to name of i end tell set aName to aName & "_origFol" tell application "Finder" set name of i to aName end tell end if end repeat if zipDmg = true then repeat with i in dmgList set j to contents of i set f1Path to quoted form of j –DMGファイルのPOSIX Path set f2Path to quoted form of (j & ".zip") –ZipファイルのPOSIX Path –タイムアウト時間は2時間 with timeout of 7200 seconds do shell script "/usr/bin/zip -r -j " & f2Path & " " & f1Path do shell script "/bin/rm -f " & f1Path end timeout end repeat end if end tell –指定のフォルダ(alias)をDiskImageに変換する on makeDMGfromFolderAlias(aaSel, aPassword) set aPassword to aPassword as string tell application "Finder" set fn to name of aaSel end tell set aDir to (POSIX path of aaSel) set aDir to quoted form of aDir set fp2 to do shell script "dirname " & aDir set fp2 to fp2 & "/" set outPath to (fp2 & fn & ".dmg") if aPassword is not equal to "" then –パスワードつきの場合 set aCMD to "printf ’" & aPassword & "’ | hdiutil create -encryption -srcfolder " & aDir & " " & (quoted form of outPath) else –パスワードなしの場合 set aCMD to "hdiutil create -srcfolder " & aDir & " " & (quoted form of outPath) end if set fp3 to do shell script aCMD return outPath end makeDMGfromFolderAlias –指定フォルダ内をすべて削除し、そのフォルダ自体も削除 on deleteFolderItself(aFol) set aU to (quoted form of POSIX path of aFol) do shell script "rm -rf " & aU end deleteFolderItself |