AppleScript: 'existe' retorna verdadeiro sempre

3

Em todo existsAppleScript, o resultado é verdadeiro. Por exemplo:

set a to (POSIX path of (((path to home folder from user domain) as text) & "skfhshfkh:" & "hfjhsfhsj:"))
if exists a then
    display dialog "AppleScript returns a wrong worth ..."
end if

O resultado é

tell current application
    path to home folder from user domain
        --> alias "Macintosh HD:Users:[User]:"
end tell
tell application "Script Editor"
    exists "/Users/[User]/skfhshfkh/hfjhsfhsj/"
        --> true
    display dialog "AppleScript returns a wrong worth ..."
        --> {button returned:"OK"}
end tell
Ergebnis:
{button returned:"OK"}

Esse caminho não existe, então onde está o erro? É meu erro ou é um bug no AppleScript?

Obrigado por qualquer ajuda.

user121028
fonte

Respostas:

2

Não sou de maneira alguma um especialista em Applescript, mas é isso que eu recolhi dos meus próprios problemas ao longo dos anos.
Eu apreciaria correções se houver imprecisões ou métodos melhores .. mas com alguns 'por que funciona' para iniciantes ;-)

Na verdade, o que você está fazendo é perguntar ao Editor de scripts se a string "/Users/[User]/skfhshfkh/hfjhsfhsj/"existe ... o que existe, você acabou de dizer que sim ;-)
O Editor de scripts não sabe o que é um arquivo, nem como procurá-lo, por isso está tratando a string como uma string, não como um caminho.

A maneira mais simples de fazer isso é usar o Finder ou o System Events que possuem sua própria rotina 'existe'.

Neste primeiro exemplo, você pode inserir como arquivo POSIX ou apenas arquivo, e ajustar sua sintaxe de acordo.

Então, isso deve funcionar, para um arquivo ...

set msg to "No sign of it"
tell application "Finder"    
    --if exists POSIX file "/volumes/MacintoshHD/Users/[user]/Desktop/testFile.rtf" then
    --or
    --if exists file ((path to home folder as text) & "Desktop:" & "testFile.rtf") then
    --or
    --if exists file "MacintoshHD:Users:[user]:Desktop:testFile.rtf" then
    --but NOT
    --if exists POSIX file ((path to home folder as text) & "Desktop:" & "testFile.rtf") then
        set msg to "Yeah, found it!"
    end if
end tell

display dialog msg

A exibição da caixa de diálogo fora da mensagem do Finder impede que o Finder chegue à frente apenas para apresentá-la.

Como alternativa, você pode definir seu caminho fora da função existente.
Este seria o meu método preferido, e usa System Events em vez de Finder ...

set theFile to ((path to home folder as text) & "Desktop:" & "testFile.rtf")
set msg to "No sign of it."

tell application "System Events"
    if exists file theFile then
        set msg to "Yeah, found it!"
    end if
end tell

display dialog msg

Observe que, usando Eventos do Sistema, você deve colocar a caixa de diálogo fora da caixa, pois os Eventos do Sistema não exibirão a caixa de diálogo.

Em qualquer um desses exemplos, tentar iniciar com um arquivo POSIX e tentar concatenar o caminho adicional usando & "Folder:" & "Filename"não fará o que você espera.
Este é um ponto em que não sei por que não, mas não.

Uma última nota - se você estiver procurando por uma file, todas as opções acima funcionam.
Se você estiver procurando por um folder, use este…

set theFolder to ((path to home folder as text) & "Desktop:" & "testFolder:")
set msg to "No sign of it."

tell application "System Events"
    if exists folder theFolder then
        set msg to "Yeah, found it!"
    end if
end tell

display dialog msg
Tetsujin
fonte