태그 보관물: menu-bar

menu-bar

왜이 Applescript가 처음에 실패하지만 항상 그 후에 작동합니까? 그러나 시간이 지나서 다시 트리거하면 처음에 다시

다음 Applescript는 QuickHue라는 메뉴 표시 줄 앱을 열고 메뉴에서 지정된 항목을 클릭합니다. 종종 애플 스크립트를 사용할 때 아무것도하지 않습니다. 그러나 잠시 기다렸다가 다시 시도하면 완벽하게 작동합니다. 그리고 계속 작동합니다. 그러나 시간이 지나서 다시 트리거하면 처음에 다시 실패합니다. 그 후에는 챔피언처럼 작동합니다. 여기 애플 스크립트가 있습니다. 여기서 무슨 일이 일어나고 있는지 아십니까?

ignoring application responses
    tell application "System Events" to tell process "QuickHue"
        click menu bar item 1 of menu bar 1
    end tell
end ignoring
do shell script "killall System\\ Events"
delay 0.1
tell application "System Events" to tell process "QuickHue"
    tell menu bar item 1 of menu bar 1
        click menu item 2 of menu 1
    end tell
end tell


답변

스크립트가 성공했는지 여부를 추적하고 스크립트가 완료 될 때까지 (또는 일부 차단 시간이 지날 때까지) 계속 시도하는 루프를 작성할 수 있습니다. 실제로 문제가 시스템 이벤트가 완전히 시작되지 않은 경우 응용 프로그램 시스템 이벤트가 실행 중인지 루프가 시스템 이벤트를 요청할 수 있습니다. 사용할 수있는 간단한 기능은 다음과 같습니다.

on appIsRunning(appName)
    tell application "System Events" to (name of processes) contains appName
end appIsRunning

완전히 시작되었는지 확인하기 위해 루프 후 지연을 구현할 수 있습니다.

루프 함수는 다음과 같습니다.

on startApp(appName)
    set IsRunning to false
    set tries to 20
    repeat until (IsRunning is true or tries is 0)
        set IsRunning to appIsRunning(appName)
        set tries to (tries - 1)
        delay 0.1
    end repeat
end startApp

또는 스크립트의 성공적인 실행을 결정하는 다른 방법이있을 수 있습니다. 성공을 확인할 수있는 상태가 있습니까? 그렇다면 시스템 이벤트 시작 여부 대신 해당 조건이 충족 될 때까지 루프 할 수 있습니다.

또 다른 것은, 시스템 이벤트가 작동하기 위해 애플 스크립트가 시작되기 전에 시스템 이벤트가 애플 스크립트에 “등록”해야하는지 모르겠습니다. 그렇다면 다음을 시도하십시오. 시스템 이벤트를 시작한 다음 다음과 같이 스크립트를 실행하는 별도의 도우미 스크립트를 만들 수 있습니다.

startApp("System Events")
set myApp to "/Users/whatever/myScriptAsApp.app"
do shell script "open " & quoted form of POSIX path of myApp & " 2>&1 &"

어떻게되는지 알려주세요. 나는 종종 내 스크립트 몇 가지와 같은 문제가 있습니다. 나는 아직 이것을 시도하지 않았습니다.

행운을 빈다, Rob


답변

네 말이 맞아, 나는 그것을 충분히 테스트하지 않았다. 시스템 이벤트가 아직 실행되고 있지 않은 경우 오류가 표시되었습니다. 또 다른 해결 방법으로, 나는 추가 launch application "System Events"delay 0.2시작에 :

launch application "System Events"
delay 0.2
ignoring application responses
    tell application "System Events" to tell process "QuickHue"
        click menu bar item 1 of menu bar 1
    end tell
end ignoring
do shell script "killall System\\ Events"
delay 0.1
tell application "System Events" to tell process "QuickHue"
    tell menu bar item 1 of menu bar 1
        click menu item 2 of menu 1
    end tell
end tell

여전히 작동하지 않으면 지연을 늘리십시오.


답변