AppleScript名:指定フォルダ以下のすべてのファイルを再帰で取得(spotlightで処理).scpt |
use AppleScript version "2.4" use framework "Foundation" use scripting additions use mdLib : script "Metadata Lib" version "1.0.0" –https://www.macosxautomation.com/applescript/apps/Script_Libs.html#Metadata_Lib –set theFolder to choose folder set theFolder to (path to desktop folder) set theFiles to mdLib’s searchFolders:{theFolder} searchString:"kMDItemContentType IN[c] %@" searchArgs:{"com.apple.applescript.script", "com.apple.applescript.script-bundle"} |
カテゴリー: System
指定フォルダ以下のすべてのファイルを再帰で取得 v2
指定フォルダ以下のすべてのファイルを再帰で取得するAppleScriptです。
「指定フォルダ以下のファイルを取得する」やりかたは、Spotlightを使うのがベストです。ベストではあるものの、各ユーザーのHDDなりSSDは「破損している」ケースもあって、Spotligtの検索が効かない場合もあります。
また、マウントしたLAN上のファイルサーバーに対してSpotlightが効くかどうかは実際にやってみないと分かりません。OSが異なる可能性がありますし、同じmacOSであっても効くかどうかは実際に試してみるまではっきりしません(開発時に真っ先に確認するポイントでもあります。ファイルサーバーを相手に処理するつもりかどうかの確認です)。
そこで、地道に再帰処理でファイルを取得すること「も」試してみることになるわけですが、ここでFinderを使うと遅くなります。
OS X 10.6以降の64ビット化されたいわゆる「Cocoa Finder」は処理速度が低下しているため、大量のファイル処理をFinder経由で行うことは「悪手」といえます。数百個ぐらいでけっこうな処理速度の低下がみられます。1,000を超えると露骨に速度が下がります。フィルタ参照で条件をつけて抽出するのも速度低下につながります。さらに複数のフィルタ条件を指定するとアホみたいに遅くなります。Cocoa Finderの性能低下はハンパではありません。
たまに、Classic Mac OSの環境しか知らない人が久しぶりに現代の(64ビット化された)macOS上で昔と同じようにFinderに対して膨大なファイルの処理を行わせて「遅い」と文句を言っているのを見かけますが、Finder経由でのファイル処理が現実的ではないという状況を知らなければそういう感想になってしまうかもしれません。
# Classic MacOS〜macOS 10.6ぐらいまではFinder経由で行っても、極端に時間がかかることはありませんでした。それ以降の環境のお話です。また、macOS 10.7以降でも、数個〜数十程度のすくないファイルを処理する場合には、あまり問題になりません
そこで、NSFileManagerを用いてファイル処理を行うことで、「Spotlightほど速くはないものの、Finderで処理するよりははるかに高速」な処理を行えます。
AppleScript名:指定フォルダ以下のすべてのファイルを再帰で取得 v2 |
— Created 2017-08-04 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" property NSString : a reference to current application’s NSString property NSPredicate : a reference to current application’s NSPredicate property NSFileManager : a reference to current application’s NSFileManager property NSMutableArray : a reference to current application’s NSMutableArray –set aFol to POSIX path of (choose folder) set aFol to POSIX path of (path to desktop folder) –set aList to retFullPathWithinAFolderWithRecursive(aFol) of me set bList to retFullPathWithinAFolderWithRecursiveFilterByExt(aFol, "scpt") of me –set cList to retFilenameWithinAFolderWithRecursiveFilterByExt(aFol, {"scpt", "scptd"}) of me –set dList to retFullPathWithinAFolderWithRecursiveFilterByExtAndFileNameString(aFol, "png", "スクリーン") of me –set eList to retFullPathWithinAFolderWithRecursiveFilterByExtAndFileNameString(aFol, {"scpt", "scptd"}, "並列") of me –指定フォルダ以下のすべてのファイルを再帰で取得 on retFilenamesWithinAFolderWithRecursive(aFol) set anArray to NSMutableArray’s array() set aPath to NSString’s stringWithString:aFol set dirEnum to NSFileManager’s defaultManager()’s enumeratorAtPath:aPath repeat set aName to (dirEnum’s nextObject()) if aName = missing value then exit repeat set aFullPath to aPath’s stringByAppendingPathComponent:aName anArray’s addObject:(aFullPath’s lastPathComponent()’s stringByDeletingPathExtension() as string) end repeat return anArray as list end retFilenamesWithinAFolderWithRecursive –指定フォルダ以下のすべてのファイルを再帰で取得 on retFullPathWithinAFolderWithRecursive(aFol) set anArray to NSMutableArray’s array() set aPath to NSString’s stringWithString:aFol set dirEnum to NSFileManager’s defaultManager()’s enumeratorAtPath:aPath repeat set aName to (dirEnum’s nextObject()) if aName = missing value then exit repeat set aFullPath to aPath’s stringByAppendingPathComponent:aName anArray’s addObject:(aFullPath’s lastPathComponent()’s stringByDeletingPathExtension() as string) end repeat return anArray as list end retFullPathWithinAFolderWithRecursive –指定フォルダ以下のすべてのファイルを再帰で取得(拡張子で絞り込み) on retFilenameWithinAFolderWithRecursiveFilterByExt(aFol, aExt) set anArray to NSMutableArray’s array() set aPath to NSString’s stringWithString:aFol set dirEnum to NSFileManager’s defaultManager()’s enumeratorAtPath:aPath repeat set aName to (dirEnum’s nextObject()) if aName = missing value then exit repeat set aFullPath to aPath’s stringByAppendingPathComponent:aName anArray’s addObject:aFullPath end repeat set thePred to NSPredicate’s predicateWithFormat:"pathExtension == [c]%@" argumentArray:{aExt} set bArray to anArray’s filteredArrayUsingPredicate:thePred return bArray as list end retFilenameWithinAFolderWithRecursiveFilterByExt –指定フォルダ以下のすべてのファイルを再帰で取得(拡張子で絞り込み) on retFullPathWithinAFolderWithRecursiveFilterByExt(aFol, aExt) set anArray to NSMutableArray’s array() set aPath to NSString’s stringWithString:aFol set dirEnum to NSFileManager’s defaultManager()’s enumeratorAtPath:aPath repeat set aName to (dirEnum’s nextObject()) if aName = missing value then exit repeat set aFullPath to aPath’s stringByAppendingPathComponent:aName anArray’s addObject:aFullPath end repeat set thePred to NSPredicate’s predicateWithFormat:"pathExtension == [c]%@" argumentArray:{aExt} set bArray to anArray’s filteredArrayUsingPredicate:thePred return bArray as list end retFullPathWithinAFolderWithRecursiveFilterByExt –指定フォルダ以下のすべてのファイルを再帰で取得(拡張子リストで絞り込み) on retFullPathWithinAFolderWithRecursiveFilterByExtList(aFol, aExtList) set anArray to NSMutableArray’s array() set aPath to NSString’s stringWithString:aFol set dirEnum to NSFileManager’s defaultManager()’s enumeratorAtPath:aPath repeat set aName to (dirEnum’s nextObject()) if aName = missing value then exit repeat set aFullPath to aPath’s stringByAppendingPathComponent:aName anArray’s addObject:aFullPath end repeat set thePred to NSPredicate’s predicateWithFormat:"pathExtension IN [c]%@" argumentArray:{aExtList} set bArray to anArray’s filteredArrayUsingPredicate:thePred return bArray as list end retFullPathWithinAFolderWithRecursiveFilterByExtList –指定フォルダ以下のすべてのファイルを再帰で取得(文字列と拡張子で絞り込み) on retFullPathWithinAFolderWithRecursiveFilterByExtListAndFileNameString(aFol, aExt, aNameString) set anArray to NSMutableArray’s array() set aPath to NSString’s stringWithString:aFol set dirEnum to NSFileManager’s defaultManager()’s enumeratorAtPath:aPath repeat set aName to (dirEnum’s nextObject()) if aName = missing value then exit repeat set aFullPath to aPath’s stringByAppendingPathComponent:aName anArray’s addObject:aFullPath end repeat set thePred to NSPredicate’s predicateWithFormat:"pathExtension == [c]%@ && lastPathComponent CONTAINS %@" argumentArray:{aExt, aNameString} set bArray to anArray’s filteredArrayUsingPredicate:thePred return bArray as list end retFullPathWithinAFolderWithRecursiveFilterByExtListAndFileNameString –指定フォルダ以下のすべてのファイルを再帰で取得(文字列と拡張子リストで絞り込み) on retFullPathWithinAFolderWithRecursiveFilterByExtAndFileNameString(aFol, aExtList, aNameString) set anArray to NSMutableArray’s array() set aPath to NSString’s stringWithString:aFol set dirEnum to NSFileManager’s defaultManager()’s enumeratorAtPath:aPath repeat set aName to (dirEnum’s nextObject()) if aName = missing value then exit repeat set aFullPath to aPath’s stringByAppendingPathComponent:aName anArray’s addObject:aFullPath end repeat set thePred to NSPredicate’s predicateWithFormat:"pathExtension IN [c]%@ && lastPathComponent CONTAINS %@" argumentArray:{aExtList, aNameString} set bArray to anArray’s filteredArrayUsingPredicate:thePred return bArray as list end retFullPathWithinAFolderWithRecursiveFilterByExtAndFileNameString |
指定ボリウムをマウント
AppleScript名:指定ボリウムをマウント |
— Created 2015-12-01 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set aPath to current application’s |NSURL|’s URLWithString:"afp://MBA13.local/maro" set ws to current application’s NSWorkspace’s sharedWorkspace() ws’s openURL:aPath |
CocoaでDiskSpace(%)を求める
AppleScript名:CocoaでDiskSpace(%)を求める |
— Created 2015-04-01 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set aPath to current application’s NSString’s stringWithString:"/" set fileAttr to current application’s NSFileManager’s defaultManager()’s attributesOfFileSystemForPath:aPath |error|:(missing value) set fRes to (fileAttr’s objectForKey:(current application’s NSFileSystemFreeSize)) as string set aDecNum to current application’s NSDecimalNumber’s decimalNumberWithString:fRes set aFreeNum to aDecNum’s decimalNumberByDividingBy:(current application’s NSDecimalNumber’s decimalNumberWithString:"1000000000") –"G" Bytes for Storage set bFreeNum to aFreeNum as real –> 84.058387756348 |
CocoaでDiskSpace(Bytes)を求める
AppleScript名:CocoaでDiskSpace(Bytes)を求める |
— Created 2015-04-02 by Shane Stanley use AppleScript version "2.4" use scripting additions use framework "Foundation" usedSpace("/") –> 8.4346003456E+10 usedSpace2("/") –> 8.4345450496E+10 usedSpaceString("/") –> "84.35 GB" usedSpaceLongString("/") –> "45.77 GB (45,772,857,344 bytes)"–English user environment –> "45.77 GB (45,772,857,344 バイト)"–Japanese user environment tell application "Finder" free space of startup disk end tell –> 4.5784592712E+10 on usedSpace(volumePath) set theNSURL to current application’s class "NSURL"’s fileURLWithPath:volumePath –considering "ASOC in Xcode" set {theResult, theSize} to theNSURL’s getResourceValue:(reference) forKey:(current application’s NSURLVolumeAvailableCapacityKey) |error|:(missing value) return theSize as real — integer may be too big for AS end usedSpace on usedSpace2(volumePath) set fileAttr to current application’s NSFileManager’s defaultManager()’s attributesOfFileSystemForPath:volumePath |error|:(missing value) return (fileAttr’s objectForKey:(current application’s NSFileSystemFreeSize)) as real — integer may be too big for AS end usedSpace2 on usedSpaceString(volumePath) set fileAttr to current application’s NSFileManager’s defaultManager()’s attributesOfFileSystemForPath:volumePath |error|:(missing value) set fRes to fileAttr’s objectForKey:(current application’s NSFileSystemFreeSize) –Formatting set sizeString to current application’s NSByteCountFormatter’s stringFromByteCount:fRes countStyle:(current application’s NSByteCountFormatterCountStyleDecimal) return sizeString as text end usedSpaceString on usedSpaceLongString(volumePath) set fileAttr to current application’s NSFileManager’s defaultManager()’s attributesOfFileSystemForPath:volumePath |error|:(missing value) set fRes to fileAttr’s objectForKey:(current application’s NSFileSystemFreeSize) –Formatting set theFormatter to current application’s NSByteCountFormatter’s alloc()’s init() theFormatter’s setCountStyle:(current application’s NSByteCountFormatterCountStyleDecimal) theFormatter’s setIncludesActualByteCount:true set sizeString to theFormatter’s stringFromByteCount:fRes return sizeString as text end usedSpaceLongString |
指定フォルダが所属しているDiskの空き容量をGバイト単位で返す
AppleScript名:指定フォルダが所属しているDiskの空き容量をGバイト単位で返す |
— Created 2015-04-02 by Shane Stanley use AppleScript version "2.4" use scripting additions use framework "Foundation" set aFol to choose folder set aFolPOSIX to POSIX path of aFol set fRes to freeStorageSpaceG(aFolPOSIX) –指定フォルダが所属しているDiskの空き容量をGバイト単位で返す on freeStorageSpaceG(volumePath) set fileAttr to current application’s NSFileManager’s defaultManager()’s attributesOfFileSystemForPath:volumePath |error|:(missing value) set fileFree to (fileAttr’s objectForKey:(current application’s NSFileSystemFreeSize)) set sizeString to current application’s NSByteCountFormatter’s stringFromByteCount:fileFree countStyle:(current application’s NSByteCountFormatterCountStyleDecimal) return sizeString as text end freeStorageSpaceG |
指定ボリウム(サーバーボリウム)の空き容量を調べる
AppleScript名:指定ボリウム(サーバーボリウム)の空き容量を調べる |
— Created 2015-05-14 by Shane Stanley use AppleScript version "2.4" use scripting additions use framework "Foundation" set serverName to "maro" set aRes to getVolumeFreeSpace(serverName) of me on getVolumeFreeSpace(serverName) set anNSURL to (current application’s |NSURL|’s fileURLWithPath:"/Volumes")’s URLByAppendingPathComponent:serverName set theResult to (anNSURL’s checkResourceIsReachableAndReturnError:(missing value)) as boolean if not theResult then — not mounted, so handle error return false end if set {theResult, theSpare} to anNSURL’s getResourceValue:(reference) forKey:(current application’s NSURLVolumeAvailableCapacityKey) |error|:(missing value) if theResult as boolean then set spareString to (current application’s NSByteCountFormatter’s stringFromByteCount:theSpare countStyle:(current application’s NSByteCountFormatterCountStyleFile)) as text else — couldn’t get the value, so handle error error end if end getVolumeFreeSpace |
SDカードを検出
マウントされたドライブのうちSDカードに相当するものを検出するAppleScriptです。
ただし、iMac Proで採用されたUHS‑II対応のSDカードスロット+UHS-II対応のSDカードがどのように見えるかは実機がないので確認できません。
exFATのことも考えると、「MSDOS format」を抽出条件に入れないほうがいいのかもしれません。
AppleScript名:SDカードを検出 |
— Created 2016-10-04 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" tell application "Finder" set driveList to every disk whose format is (MSDOS format) and ejectable is true and startup is false repeat with i in driveList set myDisk to disk of (first item of i) set myMountPoint to POSIX path of (myDisk as alias) –> "/Volumes/JVCCAM_SD/" –> "/Volumes/RICOHDCX/" set sdRes to detectSDCard(myMountPoint) of me –> true –SD Card, false –Not SD Card end repeat end tell on detectSDCard(myMountPoint as string) set resData to runCommandString("system_profiler -xml SPStorageDataType") of me set aaDict to (readPlistFromStr(resData) of me) as list set aDictList to (_items of first item of aaDict) repeat with i in aDictList set j to contents of i set aMountPoint to (mount_point of j) as string –> "/Volumes/JVCCAM_SD" –> "/Volumes/RICOHDCX" if aMountPoint is not equal to "/" then if ((aMountPoint & "/") is equal to myMountPoint) then set aDevName to words of (device_name of physical_drive of j) set aMediaName to words of (media_name of physical_drive of j) –SD/SDHC/SDXCのカード検出 set aDevF to ("SD" is in aDevName) or ("SDHC" is in aDevName) or ("SDXC" is in aDevName) set aMediaF to ("SD" is in aMediaName) or ("SDHC" is in aMediaName) or ("SDXC" is in aMediaName) if (aDevF and aMediaF) then return true end if end if end repeat return false end detectSDCard –文字列で与えたシェルコマンドを実行する on runCommandString(commandStr as string) set aPipe to current application’s NSPipe’s pipe() set aTask to current application’s NSTask’s alloc()’s init() aTask’s setLaunchPath:"/bin/sh" aTask’s setArguments:{"-c", current application’s NSString’s stringWithFormat_("%@", commandStr)} aTask’s setStandardOutput:aPipe set aFile to aPipe’s fileHandleForReading() aTask’s |launch|() return current application’s NSString’s alloc()’s initWithData:(aFile’s readDataToEndOfFile()) encoding:(current application’s NSUTF8StringEncoding) end runCommandString –stringのplistを読み込んでRecordに on readPlistFromStr(theString) set aSource to current application’s NSString’s stringWithString:theString set pListData to aSource’s dataUsingEncoding:(current application’s NSUTF8StringEncoding) set aPlist to current application’s NSPropertyListSerialization’s propertyListFromData:pListData mutabilityOption:(current application’s NSPropertyListImmutable) |format|:(current application’s NSPropertyListFormat) errorDescription:(missing value) return aPlist end readPlistFromStr |
指定容量の指定名称のRAMディスクを作成する
指定容量+指定名称のRAMディスクを作成するAppleScriptです。
SSDのアクセス速度が意外と処理のボトルネックになることがあるので(並列処理時とか)、ごくまれにRAMディスクを作って処理することがあります。
ただ、ベンチマーク値では最新機種の方がこれ(↑)よりも高速なSSDを搭載していたりするので、なかなか感慨深いものがあります。実際に処理を行わせてみるとベンチマーク値ほどには差が出なかったりもします。
AppleScript名:指定容量の指定名称のRAMディスクを作成する |
— Created 2017-01-24 by Takaaki Naganoya — 2017 Piyomaru Software –https://www.tekrevue.com/tip/how-to-create-a-4gbs-ram-disk-in-mac-os-x/ use AppleScript version "2.4" use scripting additions use framework "Foundation" set dName to "RAM Disk" set dCapacity to 512 * 2 * 1000 –512MB set aCmd to "diskutil erasevolume HFS+ ’" & dName & "’ `hdiutil attach -nomount ram://" & (dCapacity as string) & "`" try do shell script aCmd end try |
指定ファイルのUTIを取得
AppleScript名:Vanilla Scriptで指定ファイルのUTIを求める |
set aFile to choose file
tell application "System Events" set aUTI to type identifier of aFile return aUTI end tell |
AppleScript名:指定ファイルのUTIを取得 |
— Created 2016-10-24 by Takaaki Naganoya — Modified 2016-10-25 by Shane Stanley — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use BridgePlus : script "BridgePlus" –https://www.macosxautomation.com/applescript/apps/BridgePlus.html set aFile to POSIX path of (choose file) set aUTI to retFileFormatUTIFromPath(aFile) of me on retFileFormatUTIFromPath(aPOSIXpath as string) load framework set aPath to current application’s NSString’s stringWithString:aPOSIXpath set aExt to (aPath’s pathExtension()) as string return (current application’s SMSForder’s UTIForExtension:aExt) as list of string or string –as anything end retFileFormatUTIFromPath |
AppleScript名:指定ファイルのUTIを取得 v2.scptd |
use AppleScript version "2.5" — El Capitan (10.11) or later use framework "Foundation" use scripting additions property |NSURL| : a reference to current application’s |NSURL| property NSURLTypeIdentifierKey : a reference to current application’s NSURLTypeIdentifierKey set aPath to POSIX path of (choose file) set utiRes to retUTIfromPath(aPath) of me on retUTIfromPath(aPOSIXPath) set aURL to |NSURL|’s fileURLWithPath:aPOSIXPath set {theResult, theValue} to aURL’s getResourceValue:(reference) forKey:NSURLTypeIdentifierKey |error|:(missing value) if theResult = true then return theValue as string else return theResult end if end retUTIfromPath |
GHKitのじっけん
AppleScript名:GHKitのじっけん |
— Created 2016-04-12 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "GHKit" –https://github.com/gabriel/GHKit –AppleScriptObjC uses "_" as special character (equivalent to ":" in method names). So, I changed them in whole project. – Original Method Name: gh_parseISO8601: – Converted Method Name: GHparseISO8601: set aStr to current application’s NSString’s stringWithString:"Sun, 06 Nov 1994 08:49:37 +0000" set aDate to (current application’s NSDate’s GHparseRFC822:aStr) as date –> date "1994年11月6日日曜日 17:49:37" set bStr to current application’s NSString’s stringWithString:"1997-07-16T19:20:30.045Z" set bDate to (current application’s NSDate’s GHparseISO8601:bStr) as date –> date "1997年7月17日木曜日 4:20:30" set cDateStr to bDate’s GHformatHTTP() –> (NSString) "Wed, 16 Jul 1997 19:20:30 GMT" set dDate to current application’s NSDate’s GHparseTimeSinceEpoch:(1.23456789E+9) –> (NSDate) 2009-02-13 23:31:30 +0000 set eDate to current application’s NSDate’s |date|() eDate’s GHisToday() as boolean –> true —–GHyesterday() cause error.. set fDate to eDate’s GHaddDays:-1 fDate’s GHwasYesterday() as boolean –> true set ffRes to ((fDate’s GHtimeAgo:false)’s |description|()) as string –> "1 day" set anArray to current application’s NSArray’s arrayWithArray:{1, 1, 3} set cArray to anArray’s GHuniq() as list –> {1, 3} set aDic to current application’s NSDictionary’s dictionaryWithDictionary:{key1:2, key2:3.1, key3:true} set aJSONstr to (aDic’s GHtoJSON:(current application’s NSJSONWritingPrettyPrinted) |error|:(missing value)) as string (* –> (NSString) "{\n "key1" : 2,\n "key3" : true,\n "key2" : 3.1\n}" *) ( current application’s NSString’s GHisBlank:" ") as boolean–> true ( current application’s NSString’s GHisBlank:(missing value)) as boolean–> true set aStr to current application’s NSString’s stringWithString:" some text " set a1Str to (aStr’s GHstrip()) as string –> "some text" set a2Str to (aStr’s GHpresent()) as string –> " some text " set a3Str to aStr’s GHreverse() –> " txet emos " set a4Str to aStr’s GHcount:"e" –> 2 |
Absolute Timeを取得
AppleScript名:Absolute Timeを取得 |
— Created 2016-07-12 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" –タイムスタンプ取得(Jan 1 2001 00:00:00 GMTからの相対秒、Absolute Timeで取得) set aTime to current application’s NSString’s stringWithFormat_("%@", current application’s CFAbsoluteTimeGetCurrent()) as string –> "490022703.57607" |
自然言語テキストから日付を抽出
NSDataDetectorを用いて、自然言語テキスト(ここでは日本語のテキスト)から日付の情報を抽出するAppleScriptです。
AppleScript名:自然言語テキストから日付を抽出 |
— Created 2015-10-08 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.5" use framework "Foundation" use scripting additions set theDate to my getDatesIn:"本テキストには次の火曜日という日付情報を含んでいる。" log theDate –> date "2015年10月13日火曜日 12:00:00" set theDate to my getDatesIn:"本テキストには今度の土曜日という日付情報を含んでいる。" log theDate –> date "2015年10月10日土曜日 12:00:00" set theDate to my getDatesIn:"昨日うな重を食べた。" log theDate –> date "2015年10月7日水曜日 12:00:00" –set theDate to my getDatesIn:"一昨日何を食べたか覚えていない。" –> error number -2700 No date found –set theDate to my getDatesIn:"The day after tommorow." –set theDate to my getDatesIn:"相対日付の認識能力は低い。明後日はいつだ?" –> error number -2700 No date found –set theDate to my getDatesIn:"本テキストには元旦という日付情報を含んでいる。" –This means 1/1 in next year –> error number -2700 No date found on getDatesIn:aString set anNSString to current application’s NSString’s stringWithString:aString set theDetector to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypeDate) |error|:(missing value) set theMatch to theDetector’s firstMatchInString:anNSString options:0 range:{0, anNSString’s |length|()} if theMatch = missing value then error "No date found with String:" & aString set theDate to theMatch’s |date|() return theDate as date end getDatesIn: |
GMTとの時差を求める
AppleScript名:GMTとの時差を求める |
set tDIff to (time to GMT) / 3600 –> 9.0 |
UTCTime StringとNSDateの相互変換
AppleScript名:UTCTime StringとNSDateの相互変換 |
— Created 2015-02-24 by Shane Stanley — Changed 2015-02-25 By Takaaki Naganoya use AppleScript version "2.4" use scripting additions use framework "Foundation" set aStr to retUTCTimeString() –> "2018-02-13T12:40:01.936" set aNSDate to retNSDateFromUTCString(aStr) as date –> date "2018年2月13日火曜日 21:39:43" –Current Date -> UTCTime String on retUTCTimeString() –There is need to get Current Calendar in my Time Zone set aCalendar to current application’s NSCalendar’s currentCalendar() set aTimeZone to (aCalendar’s timeZone) set tDiff to (aTimeZone’s secondsFromGMT()) set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init() theNSDateFormatter’s setDateFormat:"yyyy-MM-dd’T’HH:mm:ss.SSS" theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneForSecondsFromGMT:tDiff) return (theNSDateFormatter’s stringFromDate:(current application’s NSDate’s |date|())) as text end retUTCTimeString –UTCTime String -> NSDate on retNSDateFromUTCString(aText) set aStr to current application’s NSString’s stringWithString:aText set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init() theNSDateFormatter’s setDateFormat:"yyyy-MM-dd’T’HH:mm:ss.SSS" theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneForSecondsFromGMT:0) return theNSDateFormatter’s dateFromString:aStr end retNSDateFromUTCString |
ISO8601を考慮した週カウント v2
AppleScript名:ISO8601を考慮した週カウント v2 |
— Created 2016-02-10 by Takaaki Naganoya — Modified 2016-03-26 by Takaaki Naganoya — NSGregorianCalendar -> NSCalendarIdentifierGregorian — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set aNSDate to makeNSDate(2016, 1, 1) of me set aCal to current application’s NSCalendar’s currentCalendar() aCal’s setMinimumDaysInFirstWeek:1 set aWN to (aCal’s components:(current application’s NSWeekCalendarUnit) fromDate:aNSDate)’s week() aCal’s setMinimumDaysInFirstWeek:4 –ISO8601 Week Count set bWN to (aCal’s components:(current application’s NSWeekCalendarUnit) fromDate:aNSDate)’s week() return {aWN, bWN} –> {1, 52} –Y,M,Dを指定してNSDateを作成 on makeNSDate(aYear as integer, aMonth as integer, aDay as integer) set aComp to current application’s NSDateComponents’s alloc()’s init() aComp’s setDay:aDay aComp’s setMonth:aMonth aComp’s setYear:aYear set aGrego to current application’s NSCalendar’s calendarWithIdentifier:(current application’s NSCalendarIdentifierGregorian) set aDate to aGrego’s dateFromComponents:aComp return aDate end makeNSDate |
ISO8601フォーマット日付のテキストをdateに変換
AppleScript名:ISO8601フォーマット日付のテキストをdateに変換 |
— Created 2015-08-28 20:19:04 +0900 by Takaaki Naganoya — 2015 Piyomaru Software — http://www.tondering.dk/claus/cal/iso8601.php use AppleScript version "2.4" use scripting additions use framework "Foundation" use BridgePlus : script "BridgePlus" –https://www.macosxautomation.com/applescript/apps/BridgePlus.html set aStr to "2010-12-01T21:35:43+09:00" BridgePlus’s datesFromStrings:{aStr} inFormat:"yyyy-MM-dd’T’HH:mm:ssZ" –> {date "2010年12月1日水曜日 21:35:43"} set aStr to "2010-12-01 21:35:43" BridgePlus’s datesFromStrings:{aStr} inFormat:"yyyy-MM-dd HH:mm:ss" –> {date "2010年12月1日水曜日 21:35:43"} |
ISO8601日付文字列を生成 v2
AppleScript名:ISO8601日付文字列を生成 v2 |
use AppleScript version "2.5" use scripting additions use framework "Foundation" set aDate to getDateInternational(2018, 12, 18, 9, 59, 35, "CET") –―year, month, date, hour, minute, second, time zone abbreviation. set bStr to retISO8601DateTimeString(aDate, "CET") as string –> "2018-12-18T09:59:35+01:00" –NSDate -> ISO8601 Date & Time String on retISO8601DateTimeString(targDate, timeZoneAbbreviation) set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init() theNSDateFormatter’s setDateFormat:"yyyy-MM-dd’T’HH:mm:ssZZZZZ" — Five zeds to get a colon in the time offset (except with GMT). theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneWithAbbreviation:(timeZoneAbbreviation)) return (theNSDateFormatter’s stringFromDate:targDate) as text end retISO8601DateTimeString –Make a GMT Date Object with parameters from a given time zone. on getDateInternational(aYear, aMonth, aDay, anHour, aMinute, aSecond, timeZoneAbbreviation) set theNSCalendar to current application’s NSCalendar’s currentCalendar() theNSCalendar’s setTimeZone:(current application’s NSTimeZone’s timeZoneWithAbbreviation:(timeZoneAbbreviation)) set theDate to theNSCalendar’s dateWithEra:1 |year|:aYear |month|:aMonth |day|:aDay hour:anHour minute:aMinute |second|:aSecond nanosecond:0 return theDate as date end getDateInternational |
date objectをRFC2822 date stringに変換
AppleScript名:date objectをRFC2822 date stringに変換 |
— Created 2017-12-19 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set aDate to getDateInternational(2018, 2, 1) of me set bStr to rfc2822DateTimeString(aDate, "JST") as string –> "Thu, 01 Feb 2018 00:00:00 +0900" –date -> RFC2822 Date & Time String on rfc2822DateTimeString(targDate, timeZoneName as string) set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init() theNSDateFormatter’s setDateFormat:"EEE, dd MMM yyyy HH:mm:ss Z" theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s alloc()’s initWithName:timeZoneName) theNSDateFormatter’s setLocale:(current application’s NSLocale’s alloc()’s initWithLocaleIdentifier:"en_US_POSIX") return (theNSDateFormatter’s stringFromDate:targDate) as text end rfc2822DateTimeString –Make Date Object from parameters on getDateInternational(aYear as integer, aMonth as integer, aDay as integer) set theNSCalendar to current application’s NSCalendar’s currentCalendar() set theDate to theNSCalendar’s dateWithEra:1 |year|:aYear |month|:aMonth |day|:aDay hour:0 minute:0 |second|:0 nanosecond:0 return theDate as date end getDateInternational |
RFC822エンコーダー v0
AppleScript名:RFC822エンコーダー v0 |
— Created 2016-02-07 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" set aStr to "2016-02-06 11:00:00" set rfc822str to retRFC822StrFromDateStr(aStr) of me –> "Sat, 06 Feb 2016 11:00:00GMT" on retRFC822StrFromDateObj(aObj) set aFormat to "yyyy-MM-dd HH:mm:ss" set aTZ to "GMT" set bDate to retNSDateFromStringWithTimeZone(aStr, aFormat, aTZ) of me set aGMform to current application’s NSDateFormatter’s alloc()’s init() aGMform’s setDateFormat:"EEE, dd MMM yyyy HH:mm:ss" aGMform’s setTimeZone:(current application’s NSTimeZone’s timeZoneForSecondsFromGMT:0) set usLocale to current application’s NSLocale’s alloc()’s initWithLocaleIdentifier:"GMT" aGMform’s setLocale:usLocale set theDate to aGMform’s stringFromDate:bDate set theDate to theDate’s stringByAppendingString:"GMT" return theDate as string end retRFC822StrFromDateObj on retRFC822StrFromDateStr(aStr) set aFormat to "yyyy-MM-dd HH:mm:ss" set aTZ to "GMT" set bDate to retNSDateFromStringWithTimeZone(aStr, aFormat, aTZ) of me set aGMform to current application’s NSDateFormatter’s alloc()’s init() aGMform’s setDateFormat:"EEE, dd MMM yyyy HH:mm:ss" aGMform’s setTimeZone:(current application’s NSTimeZone’s timeZoneForSecondsFromGMT:0) set usLocale to current application’s NSLocale’s alloc()’s initWithLocaleIdentifier:"GMT" aGMform’s setLocale:usLocale set theDate to aGMform’s stringFromDate:bDate set theDate to theDate’s stringByAppendingString:" GMT" return theDate as string end retRFC822StrFromDateStr on retNSDateFromStringWithTimeZone(aText, aFormat, aTZ) set aStr to current application’s NSString’s stringWithString:aText set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init() theNSDateFormatter’s setDateFormat:(current application’s NSString’s stringWithString:aFormat) theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneWithAbbreviation:(current application’s NSString’s stringWithString:aTZ)) return (theNSDateFormatter’s dateFromString:aStr) –as date end retNSDateFromStringWithTimeZone |