Yosemite로 전환 한 이후 AppleScript“지연”명령이 작동하지 않습니다


10

참고 : 이 문제 delay는 OS X 10.11 El Capitan에서 수정되었습니다.

Yosemite로 업그레이드 한 이후 지연을 사용하는 Applescript가 작동을 멈췄습니다. 이 문제를 어떻게 해결할 수 있습니까?

다음은 쉬운 예를 위해 세계에서 가장 간단한 Applescript입니다.

set volume output volume 0
delay 5
set volume output volume 20
delay 5
set volume output volume 0
delay 5
set volume output volume 20
delay 5
set volume output volume 0
delay 5
set volume output volume 20
delay 5
set volume output volume 0

완료하는 데 30 초가 걸립니다. 스크립트 편집기 (이전의 Applescript 편집기)에서 실행하면 완료하는 데 30 초가 걸립니다. 그러나이 스크립트를 앱으로 저장하면 앱을 시작할 때 지연이 무시되고 앱이 완료되는 데 1 초가 걸립니다.

다음 단계로 넘어 가기 전에 Applescript가 지정된 시간 동안 지연되도록하려면 어떻게해야합니까? 이것은 요세미티 결함입니까? 신뢰할 수있는 해결 방법이 있습니까?


내 Mac에서 예상대로이 작품 (10.10.1)
markhunte

그것이 광산에서 작동하지 않는 이유는 무엇입니까? 명확히하기 위해 : 스크립트 편집기에서 작동하지만 스크립트를 앱으로 저장 한 다음 앱을 시작하면 지연이 무시됩니다. 가장 이상한 일입니다.
2oh1

나는 10.10.3에 같은 문제가
토마스 TEMPELMANN


1
이 문제는 OS X 10.11 El Capitan에서 수정되었습니다.
Chris 페이지

답변:


7

참고 : 이 문제 delay는 OS X 10.11 El Capitan에서 수정되었습니다.

@ 2oh1, 당신은 당신의 대답에 올바른 기본 아이디어를 가지고 있지만 다음은 완전하고 정확한 대답입니다.

이 문제를 해결하는 유일한 방법은 루프 내에서 "지연"을 호출하여 계속하기 전에 원하는 지속 시간이 경과되도록하는 것입니다. 이를 수행하는 가장 좋은 방법은 사용자 지정 처리기로 "지연"을 재정의하는 것입니다.

on delay duration
  set endTime to (current date) + duration
  repeat while (current date) is less than endTime
    tell AppleScript to delay endTime - (current date)
  end repeat
end delay

이렇게하면 나머지 스크립트를 변경하지 않고 "지연"을 정상적으로 사용할 수 있습니다.

delay 5
display alert "I like cake!"

[참고 : 일반적으로 사용자 정의 처리기는 "연속 지속 시간"을 사용하여 내장 된 "지연"을 호출하지만 스크립트 편집기 내에서 작동하지만 애플릿 내에서 사용될 때 오류를 반환합니다. t 지연 계속. (-1708)”). "계속"을 사용하는 대신 지연 명령을 처리하도록 AppleScript에 직접 지시하여이 문제를 해결했습니다.]

문제는 delay스크립트를 일시 중지하는 동안 사용자 입력 을 처리하므로 애플릿에 의해 표시되는 메뉴 또는 창을 계속 클릭 할 수 있으며 delay스크립트 실행을 다시 시작하기 전에 사용자 입력으로 인해 전체 지속 시간을 기다리지 않는 버그 (10.11에서 수정 됨)가 있습니다 . 애플릿과 상호 작용하지 않으면 delay올바르게 작동합니다.


이 모든 것이 버그입니까, 아니면 요세미티에서 지연이 작동하는 이유가 있습니까?
2oh1

지연이 지연되지 않는 버그입니다.
Chris Page

너무 이상하다. 나는 다른 밤 지연을 사용하는 애플 스크립트를 땜질하고 있었고 갑자기 지연이 다시 올바르게 작동했습니다. 버그가 수정되었다고 가정했습니다. 한 시간 후 아무 변화도 없었지만 버그가 다시 발생했습니다. 나는 정말로 당황했다. 그래도 상관 없습니다. 변수를 사용하여 5 분 후 (예 :)까지 시간과 지연을 설정하고 완벽하게 작동합니다. 문제는 해결되었지만 문제가 존재하는 이유를 설명하지는 않습니다. 흥미롭고 흥미롭고 흥미 롭습니다.
2oh1

1
애플이 멍청했기 때문이다. 애플 소프트웨어는 매년 OS X 출시를 시작한 이래로 안정성이 훨씬 떨어졌습니다. OS가 확고한 상위 OS (부 버전 10.6.8)가 그리워요. 당신은 더 이상 그런 종류의 경험을 얻지 못합니다.
William T Froggard 7

그것이 버그 (동의합니다)인데 왜 여전히 수정되지 않습니까? 여기 아무도 레이더 보고서를 작성 했습니까? 그런 다음 ID를 게시 하시겠습니까? (또는 / 또한 openradar.me에 게시)
토마스 TEMPELMANN

5

이 같은 문제를 해결하는 동안 관련없는 질문 에 대한 이 답변 을 발견하고 시도하기로 결정했으며 그것은 나를 위해 일하는 것 같습니다.

간단하게 교체 delay 5do shell script "/bin/sleep 5"같은 결과를 얻을.


공유해 주셔서 감사합니다! 앞에서 말했듯이, 나에게 이해가되지 않는 이유로 지연 5가 지금 당장 작동하고 있기 때문에 이것을 테스트 할 수 없습니다 (잠시 전에 다시 테스트했습니다). 왜 이것이 때때로 작동하고 때로는 실패하는지 모릅니다. 너무 이상하다. 현재 시간을 가져 와서 변수로 설정 한 다음 해결 방법을 사용하여 변수를 설정 한 다음 시간에 1을 더한 시간 (1 분 지연)이 될 때까지 스크립트를 일시 중지하십시오. 그것은 복잡하지만 몇 달 동안 완벽하게 작동했지만 간단한 지연은 간헐적이었습니다. 어.
2oh1

나는 10.10.5를 실행하고이 솔루션은 작동하지 않습니다 또한 수면의 기간 동안 스크립트를 고정
그렉

@Greg : 수면 시간 동안 "스크립트를 잠그면"작동합니다. /bin/sleep수면 시간 동안 대기하고 완료 될 때까지 돌아 오지 않습니다. 반대로, AppleScript의 내장 delay명령은 스크립트가 일시 정지 된 동안 사용자 입력 이벤트를 처리합니다. (버그가있는 위치 : 사용자 키보드 입력이 delay있는 경우 지연 시간이 완료되기 전에 스크립트 실행을 계속합니다.)
Chris Page

3

이것이 최선의 해결책이라고 말하지는 않지만 내 문제를 해결 한 것 같습니다. 내가 이해하지 못하는 이유로 무시되는 간단한 지연을 사용하는 대신 새로운 시간에 도달 할 때까지 시간을 보내고 반복하는 것으로 전환했습니다 (아직 지연을 사용하지만 무시해도 문제가되지 않습니다) 스크립트가 시간에 도달 할 때까지 지속되지 않기 때문에 지연).

# Pause for five minutes
set GetTheTime to current date
set NewTime to GetTheTime + (5 * minutes)
repeat while (current date) is less than NewTime
    delay 60
end repeat

나는 왜 지연이 무시되고 있는지 (또는 극적으로 빨라 졌습니까?! ??) 알기 위해 죽어 가고 있지만, 이것은 일을 끝내고 서투르게 만듭니다.


"지연"명령이 "스피드"되지 않고 중단됩니다. 지연되는 동안 키보드 입력 이벤트가 있는지 검사하여 명령 기간을 확인할 수 있습니다. 사용자 입력이 감지되면 지연 루프가 올바르게 종료되지 않는 것 같습니다.
Chris 페이지

흥미 롭습니다! Mac이 유휴 상태 일 때도 무시되고 (sped up? interrupted?) 무시되고 있지만 그 이유를 모르겠습니다.
2oh1

사용자 입력 이벤트가 이벤트 큐에 delay있으면 이벤트를 처리하고 큐에서 제거 할 때까지 계속 중단됩니다.
Chris Page

2

독일 포럼 게시물 에서 해결 방법을 찾았 습니다 . 스크립트 맨 위에 다음 행을 추가하십시오.

use framework "Foundation"
use scripting additions
current application's NSThread's sleepForTimeInterval:1

어떤 이유로 든 지연이 현재 Mac에서 예상대로 작동하기 때문에 답을 테스트하는 데 문제가 있습니다. 왜 그런지 모르겠습니다. 10.10.3을 실행 중입니다. 아마도 애플은이 버그를 고쳤 을까? 또는 현재 Mac에 영향을 미치지 않는 간헐적 인 문제 일 수도 있습니다. 어. 위에서 말했듯이 내 해결 방법은 Applescript가 현재 시간을 얻은 다음 현재 시간에 x를 더할 때까지 지연시키는 것입니다.
2oh1

10.10.3도 실행 중이며 여전히 문제가 발생합니다. 모든 사람이이 문제를보고있는 것은 아니기 때문에 타사 소프트웨어 또는 특정 환경 설정과 관련이있을 수 있습니다. 누가 알아. BTW, 해결 방법은 앱이 대기하는 동안 100 % CPU 시간을 계속 사용한다는 단점이 있지만 적절한 지연 동작은 해당 기간 동안 앱을 절전 모드로 전환하여 전력을 덜 사용하는 것입니다.
Thomas Tempelmann

10.10.5를 실행 중이며이 솔루션이 작동하지 않습니다.
Greg Greg

@ThomasTempelmann : 사용자 입력이있을 때 문제가 발생합니다. 스크립트가 실행되는 동안 클릭하거나 입력하지 않으면 버그가 발생하지 않습니다.
Chris 페이지

이 솔루션을 사용하면 응용 프로그램이 절전 기간 동안 실제로 정지됩니다. delay스크립트가 일시 중지 된 상태에서 사용자 입력을 처리하므로 예를 들어 메뉴 및 창과 계속 상호 작용할 수 있습니다.
Chris Page

0

carzyj는 최선의 답변이라고 생각하지만 Chris Page의 방법과 결합하면 다음과 같은 이점을 얻을 수 있습니다.

on delay duration
  do shell script "/bin/sleep " & duration
end delay

"지연시"를 통해 "종료 지연"을 주석 처리하여 원래 지연으로 되돌릴 수 있습니다.


나는 이것을보기 전에 비슷한 코드 수정을했다. 10.10.5를 실행 중이며이 솔루션이 작동하지 않으며 수면 기간 동안 스크립트를 잠급니다.
Greg Greg

0

이것은 @ chris-page 솔루션의 수정입니다.

응답 성과 지연 시간을 정확하게 캡처하는 것 사이의 균형 인 것 같습니다.

on delay duration
    set endTime to (current date) + duration
    repeat while (current date) is less than endTime
        set delta to duration / 100
        if duration < 0.2 then
            set delta to 0.2
        end if
        tell AppleScript to delay delta
    end repeat
end delay

그러나 Applescript에 전체 기간 동안 지연하도록 지시하는 대신 일부 기간 동안 지연되도록 지시합니다. 기간이 사과가 허용하는 시간 (1 초의 1/60)보다 짧으면 해당 델타로 설정해 봅시다. 우리는 약간의 응답 성을 유지할 수 있지만 여전히 정확합니다. 의혹은 때때로 지연이 작동하지 않기 때문에 반복 루프가 스레드를 잠근 상태로 유지하지만 성공 시나리오에서는 프로세스가 여전히 중단 될 수 있도록 지연 델타가 짧기를 원합니다.


요청 된 지연 시간을 단축 할 필요는 없으며 스크립트를 더 느리게 실행하고 대기하는 동안 더 많은 CPU를 소비 할 수 있습니다. 내 버전은 원하는 전체 지속 시간이 경과 할 때까지 지연을 호출하여 delay실행을 계속하기 전에 최대한 지연시킬 수 있습니다.
Chris Page

이 답변이 게시 된 이후, 내가 사용하려면 코드 업데이트주의 delay endTime - (current date)대신 delay duration하는 경우 것이 어떤 보장하지만를 delay 하지 않습니다 중단 얻을 당신이하려고했는지되었을 수있는, 더 이상 원래 요청한 시간보다 스크립트를 일시 정지하지 않습니다 이 답변으로 주소를 지정하십시오.
Chris 페이지

0

따라서 모든 것을 종합하기 위해 Chris는 이것을 의미한다고 생각합니다.

on delay duration
   set endTime to (current date) + duration
   repeat while (current date) is less than endTime
      tell AppleScript to delay endTime - (current date)
   end repeat
end delay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.