Хорошо, вот моя ситуация. Я создал сценарий, функция которого заключается в конечном резервном копировании моих файлов сценариев, которые я сохраняю в папке iCloud Drive/Script Editor в двух разных местах. Каждое местоположение находится в папке с именем «JIMZ_Scriptz» на двух разных капсулах времени. Первоначально я продублировал каждый элемент, расположенный в моей папке iCloud Drive/Script Editor, в «JIMZ_Scriptz» на обеих моих капсулах времени. Поскольку каждый файл уже продублирован, функция моего скрипта теперь состоит только в том, чтобы дублировать файлы моего диска iCloud/папки редактора скриптов, дата создания которых находится в пределах последних трех дней, а дата изменения - в течение последних трех дней до « JIMZ_Scriptz» на обеих моих капсулах времени.
В процессе исследования и обучения я наткнулся на… как заставить AppleScript изменять значения уже установленных свойств в зависимости от того, сколько раз запускается сценарий . Например, я настроил этот скрипт так, чтобы при каждом пятом запуске он устанавливал значение этого свойства… property archiveMode : missing value
… в true. Далее у меня есть условный набор в этом скрипте, что если archiveMode имеет значение true, то он будет выполнять действия, которые я установил в условном выражении.
Но вот загвоздка. Пока скрипт не будет перекомпилирован и пересохранен, при каждом запуске скрипта в редакторе скриптов он будет продолжать менять значение в диапазоне property number_of_runs : 0
от 1 до 2, до 3 и так далее. При компиляции и сохранении в виде приложения, которое запускается вне редактора сценариев, оно теряет возможность сохранять и сохранять новые значения свойств и переменных . Прямо сейчас у меня установлены свойства таким образом, что каждый раз, когда я запускаю скомпилированное приложение, оно устанавливает для archiveMode значение true, отображая диалоговое окно с вопросом, хочу ли я выполнить эти определенные действия.
В: Как сделать так, чтобы пользовательское действие, расположенное в Applescript.app, выполнялось только при каждом пятом запуске приложения?
property inputPath1 : alias "Macintosh HD:Users:Smokestack:Library:Mobile Documents:com~apple~ScriptEditor2:Documents:"
property inputPath2 : alias "Macintosh HD:Users:Smokestack:Library:Script Libraries:"
property inputPath3 : alias "Macintosh HD:Users:Smokestack:Library:Workflows:Applications:Folder Actions:"
property destinationOne : "Data_Smokestack_ATC:JIMZ_Storage_Filez:JIMZ_Scriptz"
property destinationTwo : "Data_Jimmy's_ATC:Jimz_Filez:JIMZ_Storage_Filez:JIMZ_Scriptz:"
property modiedDate : (current date) - (days * 3)
property creationDate : (current date) - (days * 3)
property archiveMode : missing value
property zipMe1 : POSIX path of "/Volumes/Data_Smokestack_ATC/JIMZ_Storage_Filez/JIMZ_Scriptz"
property zipMe2 : POSIX path of "/Volumes/Data_Jimmy's_ATC/Jimz_Filez/JIMZ_Storage_Filez/JIMZ_Scriptz"
property number_of_runs : 0
property number_of_files : 0
set number_of_runs to number_of_runs + 1
if number_of_runs = 5 then
set archiveMode to true
end if
stopTimeMachine()
set MountdestinationOne to mount volume "afp://Jimmy's AirPort Time Capsule._afpovertcp._tcp.local/Data_Jimmy's_ATC"
set MountdestinationTwo to mount volume "afp://Smokestack AirPort Time Capsule._afpovertcp._tcp.local/Data_Smokestack_ATC"
if archiveMode is true then
try
set dialogAnswer to display dialog ¬
"Would You Like To Create An Archive Of Your JIMZ_Scriptz Folders In Both Of Your Time Capsules?" buttons {"Yes", "No", "Cancel"} ¬
default button "Yes"
if button returned of dialogAnswer is "Yes" then
do shell script "zip -r " & quoted form of zipMe1 & " " & quoted form of zipMe1
tell application "Finder"
set moveZipFile to POSIX file "/Volumes/Data_Smokestack_ATC/JIMZ_Storage_Filez/JIMZ_Scriptz.zip"
set moveZipFile to moveZipFile as alias
set moveZipFile2 to alias "Data_Jimmy's_ATC:Jimz_Filez:JIMZ_Storage_Filez:Zipped_Jimz_Scriptz:"
set moveZipFileTo to alias "Data_Smokestack_ATC:JIMZ_Storage_Filez:Zipped_Jimz_Scriptz:"
set number_of_files to count (items of folder moveZipFileTo)
set number_of_files to number_of_files + 1
set new_zip_name to "JIMZ_Scriptz " & number_of_files & ".zip"
set name of moveZipFile to new_zip_name
set resultObject to move moveZipFile to moveZipFileTo without replacing
set resultObject2 to duplicate resultObject to moveZipFile2
end tell
set archiveMode to false
else
backupScriptz()
end if
on error number -128 -- userCanceledErr
stopTimeMachine()
return
end try
set archiveMode to false
end if
backupScriptz()
stopTimeMachine()
on backupScriptz()
tell application "Finder"
try
with timeout of 280 seconds
duplicate (every item of inputPath1 whose modification date > modiedDate) to destinationOne with replacing
duplicate (every item of inputPath1 whose creation date > creationDate) to destinationOne with replacing
duplicate (every item of inputPath2 whose modification date > modiedDate) to destinationOne with replacing
duplicate (every item of inputPath2 whose creation date > creationDate) to destinationOne with replacing
duplicate (every item of inputPath3 whose modification date > modiedDate) to destinationOne with replacing
duplicate (every item of inputPath3 whose creation date > creationDate) to destinationOne with replacing
end timeout
with timeout of 280 seconds
duplicate (every item of inputPath1 whose modification date > modiedDate) to destinationTwo with replacing
duplicate (every item of inputPath1 whose creation date > creationDate) to destinationTwo with replacing
duplicate (every item of inputPath2 whose modification date > modiedDate) to destinationTwo with replacing
duplicate (every item of inputPath2 whose creation date > creationDate) to destinationTwo with replacing
duplicate (every item of inputPath3 whose modification date > modiedDate) to destinationTwo with replacing
duplicate (every item of inputPath3 whose creation date > creationDate) to destinationTwo with replacing
end timeout
on error the error_message number the error_number
set the error_text to "Error: " & the error_number & ". " & the error_message
my write_error_log(the error_text)
end try
end tell
end backupScriptz
on write_error_log(this_error)
set the error_log to ((path to desktop) as text) & "Jimz_Time_Capsule_Backup Error Log.txt"
try
open for access file the error_log with write permission
write (this_error & " " & (current date) & return) to file the error_log starting at eof
close access file the error_log
on error
try
close access file the error_log
end try
end try
end write_error_log
on stopTimeMachine()
tell application "System Preferences"
reveal anchor "main" of pane "com.apple.prefs.backup"
tell application "System Events"
perform action "AXPress" of checkbox "Back Up Automatically" of window "Time Machine" of application process "System Preferences"
end tell
end tell
tell application "System Preferences" to quit
end stopTimeMachine
ОБНОВЛЕНИЕ: вот версия исправленного кода. Этот обновленный код действительно будет выполнять действие, указанное в условном предложении, при каждом пятом запуске приложения.
Подход, который я выбрал, заключался в использовании команды «запись в файл». Каждый раз, когда приложение-скрипт запускается, оно записывает слово «Запущено» во внешний текстовый файл. Затем я использовал команду «чтение файла», чтобы подсчитать количество слов «Запущено» в текстовом файле. Затем я скопировал этот счет в переменную, и если эта переменная = 5, она запускает соответствующие действия и удаляет внешний текстовый файл, который запускает цикл с самого начала.
property inputPath1 : alias "Macintosh HD:Users:Smokestack:Library:Mobile Documents:com~apple~ScriptEditor2:Documents:"
property inputPath2 : alias "Macintosh HD:Users:Smokestack:Library:Script Libraries:"
property inputPath3 : alias "Macintosh HD:Users:Smokestack:Library:Workflows:Applications:Folder Actions:"
property destinationOne : "Data_Smokestack_ATC:JIMZ_Storage_Filez:JIMZ_Scriptz"
property destinationTwo : "Data_Jimmy's_ATC:Jimz_Filez:JIMZ_Storage_Filez:JIMZ_Scriptz:"
property modiedDate : (current date) - (days * 3)
property creationDate : (current date) - (days * 3)
property archiveMode : missing value
property zipMe1 : POSIX path of "/Volumes/Data_Smokestack_ATC/JIMZ_Storage_Filez/JIMZ_Scriptz"
property zipMe2 : POSIX path of "/Volumes/Data_Jimmy's_ATC/Jimz_Filez/JIMZ_Storage_Filez/JIMZ_Scriptz"
property number_of_files : 0
property launchCount : 0
writeToFile()
readFile()
if launchCount = 5 then
set archiveMode to true
tell application "Finder"
delete alias "Macintosh HD:private:tmp:Launch_Count.txt"
end tell
end if
stopTimeMachine()
set MountdestinationOne to mount volume "afp://Jimmy's AirPort Time Capsule._afpovertcp._tcp.local/Data_Jimmy's_ATC"
set MountdestinationTwo to mount volume "afp://Smokestack AirPort Time Capsule._afpovertcp._tcp.local/Data_Smokestack_ATC"
if archiveMode is true then
try
set dialogAnswer to display dialog ¬
"Creating An Archive Of Your JIMZ_Scriptz Folders In Both Of Your Time Capsules?" buttons {"OK", "NO"} ¬
default button "OK"
if button returned of dialogAnswer is "OK" then
do shell script "zip -r " & quoted form of zipMe1 & " " & quoted form of zipMe1
tell application "Finder"
set moveZipFile to POSIX file "/Volumes/Data_Smokestack_ATC/JIMZ_Storage_Filez/JIMZ_Scriptz.zip"
set moveZipFile to moveZipFile as alias
set moveZipFile2 to alias "Data_Jimmy's_ATC:Jimz_Filez:JIMZ_Storage_Filez:Zipped_Jimz_Scriptz:"
set moveZipFileTo to alias "Data_Smokestack_ATC:JIMZ_Storage_Filez:Zipped_Jimz_Scriptz:"
set number_of_files to count (items of folder moveZipFileTo)
set number_of_files to number_of_files + 1
set new_zip_name to "JIMZ_Scriptz " & number_of_files & ".zip"
set name of moveZipFile to new_zip_name
set resultObject to move moveZipFile to moveZipFileTo with replacing
set resultObject2 to duplicate resultObject to moveZipFile2
end tell
set archiveMode to false
else
backupScriptz()
end if
end try
set archiveMode to false
end if
backupScriptz()
stopTimeMachine()
on backupScriptz()
tell application "Finder"
try
with timeout of 280 seconds
duplicate (every item of inputPath1 whose modification date > modiedDate) to destinationOne with replacing
duplicate (every item of inputPath1 whose creation date > creationDate) to destinationOne with replacing
duplicate (every item of inputPath2 whose modification date > modiedDate) to destinationOne with replacing
duplicate (every item of inputPath2 whose creation date > creationDate) to destinationOne with replacing
duplicate (every item of inputPath3 whose modification date > modiedDate) to destinationOne with replacing
duplicate (every item of inputPath3 whose creation date > creationDate) to destinationOne with replacing
end timeout
with timeout of 280 seconds
duplicate (every item of inputPath1 whose modification date > modiedDate) to destinationTwo with replacing
duplicate (every item of inputPath1 whose creation date > creationDate) to destinationTwo with replacing
duplicate (every item of inputPath2 whose modification date > modiedDate) to destinationTwo with replacing
duplicate (every item of inputPath2 whose creation date > creationDate) to destinationTwo with replacing
duplicate (every item of inputPath3 whose modification date > modiedDate) to destinationTwo with replacing
duplicate (every item of inputPath3 whose creation date > creationDate) to destinationTwo with replacing
end timeout
on error the error_message number the error_number
set the error_text to "Error: " & the error_number & ". " & the error_message
my write_error_log(the error_text)
end try
end tell
display notification ¬
"Your Most Recent Script Files Have Been Backed Up" with title ¬
"BACKUP COMPLETED" sound name "Bottle"
end backupScriptz
on write_error_log(this_error)
set the error_log to ((path to desktop) as text) & "Jimz_Time_Capsule_Backup Error Log.txt"
try
open for access file the error_log with write permission
write (this_error & " " & (current date) & return) to file the error_log starting at eof
close access file the error_log
on error
try
close access file the error_log
end try
end try
end write_error_log
on stopTimeMachine()
tell application "System Preferences"
reveal anchor "main" of pane "com.apple.prefs.backup"
try
tell application "System Events"
perform action "AXPress" of checkbox "Back Up Automatically" of window "Time Machine" of application process "System Preferences"
end tell
end try
end tell
tell application "System Preferences" to quit
end stopTimeMachine
on writeToFile()
set theFile to "/tmp/Launch_Count.txt"
set theText to "Launched"
try
set writeToFile to open for access theFile with write permission
write theText & linefeed to writeToFile as text starting at eof
close access theFile
on error errMsg number errNum
close access theFile
set writeToFile to open for access theFile with write permission
write theText & linefeed to writeToFile as text starting at eof
close access theFile
end try
end writeToFile
on readFile()
set theFile1 to alias "Macintosh HD:private:tmp:Launch_Count.txt"
set theCount to count words of (read theFile1)
copy theCount to launchCount
end readFile
ОБНОВЛЕНИЕ № 2: Итак, я загрузил дополнение к скрипту под названием Satimage и переработал свой код как комбинацию команд из Satimage (в основном, команду BACKUP) в сочетании с некоторым из моего предыдущего кода из поста UPDATE в этой теме.
Вот последняя версия
В: Может ли кто-нибудь объяснить мне, почему эта новая версия занимает всего 18 секунд, без использования условий тайм-аута (не включая «команду архивирования» при пятом запуске приложения), тогда как исходное решение обычно занимало больше времени. часть 20 минут? Как сторонний скрипт может работать в 1000 раз быстрее, чем скриптовые команды Finder.app?
property archiveMode : missing value
property zipMe1 : POSIX path of "/Volumes/Data_Smokestack_ATC/JIMZ_Storage_Filez/JIMZ_Scriptz"
property zipMe2 : POSIX path of "/Volumes/Data_Jimmy's_ATC/Jimz_Filez/JIMZ_Storage_Filez/JIMZ_Scriptz"
property number_of_files : 0
property launchCount : 0
writeToFile()
writeToFile2()
readFile()
if launchCount = 5 then
set archiveMode to true
tell application "Finder"
delete alias "Macintosh HD:private:tmp:Launch_Count.txt"
end tell
end if
if archiveMode is true then
try
set dialogAnswer to display dialog ¬
"Creating An Archive Of Your JIMZ_Scriptz Folders In Both Of Your Time Capsules?" buttons {"OK", "NO"} ¬
default button "OK"
if button returned of dialogAnswer is "OK" then
do shell script "zip -r " & quoted form of zipMe1 & " " & quoted form of zipMe1
tell application "Finder"
set moveZipFile to POSIX file "/Volumes/Data_Smokestack_ATC/JIMZ_Storage_Filez/JIMZ_Scriptz.zip"
set moveZipFile to moveZipFile as alias
set moveZipFile2 to alias "Data_Jimmy's_ATC:Jimz_Filez:JIMZ_Storage_Filez:Zipped_Jimz_Scriptz:"
set moveZipFileTo to alias "Data_Smokestack_ATC:JIMZ_Storage_Filez:Zipped_Jimz_Scriptz:"
set number_of_files to count (items of folder moveZipFileTo)
set number_of_files to number_of_files + 1
set new_zip_name to "JIMZ_Scriptz " & number_of_files & ".zip"
set name of moveZipFile to new_zip_name
set resultObject to move moveZipFile to moveZipFileTo with replacing
set resultObject2 to duplicate resultObject to moveZipFile2
end tell
set archiveMode to false
else
backupScriptz()
end if
end try
set archiveMode to false
end if
on writeToFile()
set MountdestinationOne to mount volume "afp://Jimmy's AirPort Time Capsule._afpovertcp._tcp.local/Data_Jimmy's_ATC"
set MountdestinationTwo to mount volume "afp://Smokestack AirPort Time Capsule._afpovertcp._tcp.local/Data_Smokestack_ATC"
set theSource to alias "Macintosh HD:Users:Smokestack:Library:Mobile Documents:com~apple~ScriptEditor2:Documents:"
set theSource2 to alias "Macintosh HD:Users:Smokestack:Library:Script Libraries:"
set theSource3 to alias "Macintosh HD:Users:Smokestack:Library:Workflows:Applications:Folder Actions:"
set theDestination2 to alias "Data_Smokestack_ATC:JIMZ_Storage_Filez:JIMZ_Scriptz:"
set theDestination3 to alias "Data_Jimmy's_ATC:Jimz_Filez:JIMZ_Storage_Filez:JIMZ_Scriptz:"
set resultText to backup theSource ¬
onto theDestination2 ¬
level 2 ¬
after ((get current date) - 359200)
set resultText2 to backup theSource2 ¬
onto theDestination2 ¬
level 2 ¬
after ((get current date) - 359200)
set resultText3 to backup theSource3 ¬
onto theDestination2 ¬
level 2 ¬
after ((get current date) - 359200)
set resultText4 to backup theSource ¬
onto theDestination3 ¬
level 2 ¬
after ((get current date) - 359200)
set resultText5 to backup theSource2 ¬
onto theDestination3 ¬
level 2 ¬
after ((get current date) - 359200)
set resultText6 to backup theSource3 ¬
onto theDestination3 ¬
level 2 ¬
after ((get current date) - 359200)
set theFile to "/tmp/Files_To_Backup.txt"
try
set writeToFile to open for access theFile with write permission
set theReports to write resultText & resultText2 & resultText3 & resultText4 & resultText5 & resultText6 & " " & (current date) & return to writeToFile as text starting at eof
close access theFile
on error errMsg number errNum
close access theFile
set writeToFile to open for access theFile with write permission
set theReports to write resultText & resultText2 & resultText3 & resultText4 & resultText5 & resultText6 & " " & (current date) & return to writeToFile as text starting at eof
close access theFile
end try
end writeToFile
on writeToFile2()
set theFile2 to "/tmp/Launch_Count.txt"
set theText to "Launched"
try
set writeToFile2 to open for access theFile2 with write permission
write theText & linefeed to writeToFile2 as text starting at eof
close access theFile2
on error errMsg number errNum
close access theFile2
set writeToFile2 to open for access theFile2 with write permission
write theText & linefeed to writeToFile2 as text starting at eof
close access theFile2
end try
end writeToFile2
on readFile()
set theFile3 to alias "Macintosh HD:private:tmp:Launch_Count.txt"
set theCount to count words of (read theFile3)
copy theCount to launchCount
end readFile
Вам нужно использовать счетчик, который живет вне сценария. Создайте файл, содержащий количество прогонов.
Вы можете добавить точку к имени файла, чтобы сделать файл невидимым.
# https://apple.stackexchange.com/questions/298264/how-to-have-a-custom-action-located-within-an-applescript-app-execute-only-on-e
# perform a command every fifth time this script is run (as an app)
set file_exists to "no"
set file_name to "oa_counter"
set file_path to POSIX path of ((path to home folder)) & file_name
set run_count to 0
tell application "Finder" to if exists file_path as POSIX file then set file_exists to "yes"
if file_exists is "yes" then
set run_count to do shell script "cat " & POSIX path of file_path # get the current run count from the file
do shell script "rm " & POSIX path of file_path # remove the file
end if
if run_count + 1 as number is 5 then
display dialog "5" # do this every fifth time
else
set run_count to run_count + 1
do shell script "cat <<EOF >> " & POSIX path of file_path & "
" & run_count # create a new file with the new run count
return run_count
end if
Вы можете использовать оператор по модулю :
set number_of_runs to number_of_runs + 1
set archiveMode to number_of_runs mod 5 = 0 -- the result is true on 5, 10, 15, etc..
Вместо:
set number_of_runs to number_of_runs + 1
if number_of_runs = 5 then
set archiveMode to true
end if
bmike
defaults write com.foo.whatever
для сохранения счетчик для хранения счетчиков запусков.wch1zpink