Cómo tener una acción personalizada ubicada dentro de Applescript.app, ejecutar solo en cada quinto lanzamiento de la aplicación

5

Bueno, aquí está mi situación. He creado un script cuya función es, en última instancia, realizar una copia de seguridad de mis archivos de script que guardo en mi carpeta iCloud Drive / Script Editor, en dos ubicaciones diferentes. Cada ubicación está en una carpeta llamada "JIMZ_Scriptz" en dos Time Capsules diferentes. Inicialmente, duplicé todos los elementos ubicados en mi carpeta iCloud Drive / Script Editor en el "JIMZ_Scriptz" en mis dos Time Capsules. Debido a que todos los archivos ya están duplicados, la función de mi script ahora es duplicar solo los archivos de mi carpeta de iCloud drive / Script Editor, cuya fecha de creación es dentro de los últimos tres días y quién la fecha de modificación es dentro de los últimos tres días al " JIMZ_Scriptz "en mis dos Time Capsules

En mi proceso de investigación y aprendizaje, he tropezado con ... cómo hacer que un AppleScript cambie los valores de sus propiedades ya establecidas según la cantidad de veces que se ejecute el script . Por ejemplo, tengo este script configurado que en cada quinta ejecución, establecerá el valor de esta propiedad ... property archiveMode : missing value ... en verdadero. A continuación, tengo un conjunto condicional en este script que, si archiveMode es verdadero, realizará las acciones que establezca en la declaración condicional.

Pero aquí está la trampa. Mientras la secuencia de comandos no se vuelva a compilar y volver a guardar, con cada ejecución de la secuencia de comandos en el Editor de secuencias de comandos, seguirá cambiando el valor en el property number_of_runs : 0 de 1 a 2 a 3 y así sucesivamente. Cuando se compila y guarda como una aplicación y esa aplicación se ejecuta fuera de Script Editor, pierde la capacidad de guardar y almacenar nuevos valores en propiedades y variables . En este momento tengo las propiedades configuradas de manera que cada vez que ejecuto la aplicación compilada, configura archiveMode en verdadero, mostrando un cuadro de diálogo que me pregunta si quiero ejecutar esas acciones.

P: ¿Cómo tener una acción personalizada ubicada dentro de Applescript.app, ejecutar solo en cada quinto lanzamiento de la aplicación?

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

ACTUALIZACIÓN: aquí está la versión del código revisado. Este código actualizado efectivamente realizará la acción que se encuentra dentro de la cláusula condicional en cada quinto lanzamiento de la aplicación.

El enfoque que adopté fue utilizar el comando "escribir en archivo". Cada vez que se inicia la aplicación de script, escribe la palabra "Lanzado" en un archivo de texto externo. Luego utilicé el comando "leer archivo" para contar el número de las palabras "Lanzado" en el archivo de texto. Luego copié ese recuento a una variable y si esa variable = 5 activa las acciones apropiadas y elimina el archivo de texto externo, lo que inicia el ciclo desde el principio

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

ACTUALIZACIÓN # 2: descargué una adición de secuencias de comandos llamada Satimage , y reformé mi código como una combinación de comandos de Satimage (principalmente el comando BACKUP) combinado con algunos de mis códigos anteriores de la publicación ACTUALIZACIÓN en este tema.

Aquí está la última versión

P: ¿Alguien puede intentar explicarme por qué esta nueva versión tarda solo 18 segundos en completarse, sin tener que usar cláusulas de tiempo de espera (sin incluir el "comando de archivo" en el quinto lanzamiento de la aplicación), mientras que ¿La solución original usualmente tomó la mayor parte de 20 minutos? ¿Cómo puede una adición de scripts de terceros realizar 1000 veces más rápido que los comandos de scripts de 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
    
pregunta wch1zpink 13.09.2017 - 05:17

2 respuestas

3

Necesitas usar un contador que viva fuera del script. Cree un archivo que contenga el número de ejecuciones.

Puede añadir un punto al nombre del archivo para hacer que el archivo sea invisible.

# 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
    
respondido por el oa- 13.09.2017 - 11:54
3

Puede utilizar el operador módulo :

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..

En lugar de:

set number_of_runs to number_of_runs + 1
if number_of_runs = 5 then
    set archiveMode to true
end if
    
respondido por el jackjr300 13.09.2017 - 18:35

Lea otras preguntas en las etiquetas