0 votos

Applescript osacompile falla si la entrada del usuario contiene apóstrofe / comillas simples

He creado un script que toma algunas entradas de usuario de mí (indicaciones con diálogos básicos), a continuación, genera un independiente script que me envía un mensaje de texto y un correo electrónico, que luego puedo programar como una alerta de calendario para desencadenar en una fecha / hora deseada.

Todo funciona bien, hasta que hay un apóstrofe/comilla simple en la entrada del usuario. Por ejemplo, si el cuerpo de mi correo electrónico es:

Este es mi correo electrónico

el script no se ejecutará, con:

sh: -c: line 0: unexpected EOF while looking for matching `"'
sh: -c: line 1: syntax error: unexpected end of file

Aquí está el código correspondiente:

set savePath to (path to desktop as text) & _appName & ".app"

set code to "osacompile -e '
tell application \"Messages\" 
    set imessageservice to 1st service whose service type = iMessage 
    set iMessageBuddy to buddy \"" & _smsNumber & "\" of imessageservice 
    send \"" & _smsBody & "\" to iMessageBuddy
end tell
tell application \"Mail\"
    set theMessage to make new outgoing message with properties {visible:true, subject:\"" & _emailSubject & "\", content:\"" & quoted form of _emailBody & "\"} 
    tell theMessage 
        make new to recipient at end of to recipients with properties {address:\"" & _emailAddress & "\"} 
    end tell 
    send theMessage
end tell' -o " & quoted form of POSIX path of savePath

do shell script code

De nuevo, funciona muy bien siempre que no pase un apóstrofe. En mi búsqueda, parece que escapar apóstrofes en script es realmente, realmente difícil de conseguir. He intentado numerosos enfoques (heredoc, múltiples líneas -e, forma citada de, etc.) pero hasta ahora no he podido conseguir que ninguno funcione. Si alguien sabe cómo evitar esto, me encantaría escucharlo.

1voto

user3439894 Puntos 5883

Si estuviera haciendo algo así para mí, simplemente escribiría el contenido del "código" en un archivo temporal archivo de texto entonces usa osacompile para crear el AppleScript paquete de aplicaciones y a continuación borrar el archivo temporal archivo de texto . Haciéndolo de esta manera no debería tener que lidiar con el comillas simples pasó en un variable .

Lo siguiente ejemplo AppleScript código es sólo una prueba de concepto. En script Editor , sólo hay que establecer un valor para el smsNumber variable para usted, y luego ejecute el código .

Creará Foobar.app en su Escritorio para que luego Haga doble clic en y ver que le envía el mensaje con el comillas simples en él.

set appName to "Foobar"
set smsNumber to ""
set smsBody to "Here's my email"

set tempAppleScriptCode to ¬
    "/tmp/" & appName & ".applescript"

set saveToPathFileName to POSIX path of ¬
    (path to desktop as text) & appName & ".app"

set myAppleScriptCode to "tell application \"Messages\" 
    set imessageservice to 1st service whose service type = iMessage 
    set iMessageBuddy to buddy \"" & smsNumber & "\" of imessageservice 
    send \"" & smsBody & "\" to iMessageBuddy
end tell"

set tempFileWasWritten to ¬
    (my writeTextToFile(myAppleScriptCode, tempAppleScriptCode, true))

tell application "System Events" to ¬
    set saveToPathFileNameExists to ¬
        (exists item saveToPathFileName)

set saveToPathFileName to saveToPathFileName's quoted form
set tempAppleScriptCode to tempAppleScriptCode's quoted form

if tempFileWasWritten then
    if not saveToPathFileNameExists then
        do shell script "osacompile -o" & space & saveToPathFileName & ¬
            space & tempAppleScriptCode & ";rm" & space & tempAppleScriptCode
    else
        display dialog "The file '" & saveToPathFileName & ¬
            "' already exists!" buttons {"OK"} default button 1 ¬
            with title "The target file already exists!"
    end if
else
    display dialog "An error occured writing to: '" & tempAppleScriptCode & ¬
        "'" buttons {"OK"} default button 1 with title "Error writing to file!"
end if

on writeTextToFile(theText, theFile, overwriteExistingContent)
    try
        set theOpenedFile to open for access POSIX file theFile with write permission
        if overwriteExistingContent is true then set eof of theOpenedFile to 0
        write theText to theOpenedFile starting at eof
        close access theOpenedFile
        return true
    on error
        try
            close access file theFile
        end try
        return false
    end try
end writeTextToFile

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X