파일 이름을 전달하여 응용 프로그램에서 창을 닫으려면 어떻게해야합니까?


9

Mac OS X의 Preview 응용 프로그램에 특정 창을 닫으라고 알려주는 Applescript 기반 쉘 명령을 작성하려고합니다.

#!/bin/sh

osascript <<EOF
tell application "Preview"
   close "$1"
end tell
EOF

그러나 이것은 작동하지 않습니다 : 오류 메시지가 나타납니다.

25:52: execution error: Preview got an error: "musixdoc.pdf" doesn’t understand the close message. (-1708)

관련 질문 : .bash_profile에 정의 된 별칭을 사용하여 명령 줄에서 OS X 응용 프로그램을 어떻게 닫습니까?


예상대로 작동합니다. 정확히 어떻게 스크립트를 호출합니까? 참고 : 스크립트는 특정 창을 닫지 않습니다. 응용 프로그램을 종료하므로 응용 프로그램에서 열었던 모든 문서 창을 닫습니다. 응용 프로그램이 열었지만 응용 프로그램 자체를 종료하지 않은 특정 문서를 닫으려면 다른 스크립트가 필요합니다. 대부분의 응용 프로그램은 마지막 문서 창이 닫히면 종료되지만 모든 응용 프로그램이 종료되는 것은 아닙니다. 사용중인 OS X 버전에 따라 다릅니다.
slhck

@ slhck : "응용 프로그램이 열었지만 응용 프로그램 자체를 종료하지 않은 특정 문서를 닫으십시오"는 정확히 내가 필요한 것입니다. "다른 스크립트"가 설명되어있는 곳을 알고 있습니까?
Ewan Delanoy

답변:


10

AppleScript 명령을 수락하도록 Preview.app 얻기

기본적으로 AppleScripting Preview는 미리보기에 필요한 사전이 없기 때문에 작동하지 않습니다. 이 문제를 해결하려면 Lauri 's answer here를 확인 하십시오NSAppleScriptEnabled . Preview.app 설정에 대한 설명 입니다.

Preview.app를 종료 한 다음 터미널을 열고 다음을 입력하십시오.

sudo defaults write /Applications/Preview.app/Contents/Info NSAppleScriptEnabled -bool true
sudo chmod 644 /Applications/Preview.app/Contents/Info.plist
sudo codesign -f -s - /Applications/Preview.app


응용 프로그램에서 창 닫기

1) 창 인덱스 또는 창 이름

명명 된 응용 프로그램의 창을 닫는 명령은 다음과 같습니다.

tell application "Preview" to close window 1

… 또는 명명 된 문서 창을 닫으려면 다음과 같이하십시오 foo.jpg.

응용 프로그램 "미리보기"에게 닫으라고 지시하십시오 (이름이 " foo.jpg " 인 모든 창 )

따라서 쉘 스크립트에서 다음과 같습니다.

#!/bin/sh
osascript <<EOF
tell application "Preview"
  close (every window whose name is "$1")
end tell
EOF

여기서 스크립트에 전달 된 첫 번째 인수는 닫으려는 창의 이름입니다 (예 :) ./quit.sh foo.jpg. 파일에 공백이 있으면 파일 이름을 인용해야합니다 (예 :) ./quit.sh "foo bar.jpg".

또는 응용 프로그램에서 임의의 창을 닫으려면 다음을 사용하십시오.

#!/bin/sh
osascript <<EOF
tell application "$1"
  close (every window whose name is "$2")
end tell
EOF

여기서는 ./quit.sh Preview foo.jpg예를 들어 사용 합니다.

2) 파일명

특정 문서에 속하지만 파일 이름을 제공하는 창을 닫으려면 다른 것이 필요합니다. 여러 페이지로 된 PDF가로 표시 될 수 foo.pdf (Page 1 of 42)있지만 foo.pdfAppleScript 로 전달 하기를 원하기 때문 입니다.

여기서 우리는 창을 반복하고 파일 이름을 스크립트에 전달 된 인수와 비교합니다.

osascript <<EOF
tell application "Preview"
    set windowCount to number of windows
    repeat with x from 1 to windowCount
        set docName to (name of document of window x)
        if (docName is equal to "$1") then
            close window x
        end if
    end repeat
end tell
EOF

이제 간단히 전화 할 수 있습니다 ./quit.sh foo.pdf. 명명 된 문서 창이있는 모든 앱에 대해 일반적인 방식으로 다음과 같습니다.

osascript <<EOF
tell application "$1"
    set windowCount to number of windows
    repeat with x from 1 to windowCount
        set docName to (name of document of window x)
        if (docName is equal to "$2") then
            close window x
        end if
    end repeat
end tell
EOF


주의 사항 : 자동 폐쇄 Preview.app

Preview.app는 마지막 문서 창이 닫히면 자동으로 종료되는 응용 프로그램 중 하나입니다. 메모리를 절약하고 "정리"하기 위해 그렇게합니다. 이 동작을 비활성화하려면 다음을 실행하십시오.

defaults write -g NSDisableAutomaticTermination -bool TRUE

물론이를 취소하려면 TRUE로 변경 하십시오 FALSE.


스크립트 대신 함수 사용

마지막으로 쉘에서 항상 사용할 수있는 함수에 스크립트를 넣는 것이 좋습니다. 이렇게하려면에 스크립트를 추가하십시오 ~/.bash_profile. 이 파일이 없으면 작성하십시오.

cw() {
osascript <<EOF
tell application "$1"
    set windowCount to number of windows
    repeat with x from 1 to windowCount
        set docName to (name of document of window x)
        if (docName is equal to "$2") then
            close window x
        end if
    end repeat
end tell
EOF
}

bash 프로필을 저장하고 셸을 다시 시작하면 cw Preview foo.pdf어디서나 전화 할 수 있습니다.


나는 이것을 시도했다. 이번에는 오류 메시지가 나타나지 않지만 스크립트가 여전히 작동하지 않습니다. 창이 화면에 계속 표시됩니다.
Ewan Delanoy

그것은 나를 위해 일했다. Preview.app에서 도큐멘트를 연 다음 AppleScript 편집기를 열고를 입력 tell application "Preview" to windows하면 결과가 나타 납니까? 어떤 정확한 스크립트를 실행하고 있습니까?
slhck

저는 AppleScript 편집기를 사용하지 않습니다. OP에 설명 된대로 .sh 파일에 저장된 bash 스크립트에서 "내장 된 Applescript 코드"만 사용합니다.
Ewan Delanoy 2012 년

사실, 저는 보통 쉘 스크립트에 매우 만족하며 이것이 첫 번째 애플 스크립트입니다. 방금 마지막 의견에서 조언 한 것을 수행했으며 "{응용 프로그램"미리보기 "의 창 ID 113" ")를 답변으로 받았습니다. 그게 내가 받아야합니까?
Ewan Delanoy

또한 Applescript 편집기로 <musixdoc.pdf "를 닫기 위해 << 응용 프로그램에 미리보기 알리기> 컴파일하면 작동하지 않습니다. musixdoc.pdf 창이 화면에 계속 표시됩니다.
Ewan Delanoy

0

slhck의 답변은 훌륭하고 철저하게 보입니다. 세 번째 코드 행을 실행하십시오 .

sudo codesign -f -s - /Applications/Preview.app

'seems'로 인해 다음과 같이 시작할 때마다 미리보기가 중단되었습니다.

Application Specific Information:
XPC domain creation failed: The code signature is not valid: The operation couldn’t be completed. (OSStatus error -67061.)

공동 설계 매뉴얼에 따르면, 이는 -f'코드 기호를 대체하고 기존 서명을 강제로'작성 -s하고 '주어진 경로에 코드를 서명'하는 것입니다.…-

분명히 미리보기가 잘못 서명되어 사용할 수없는 것 같습니다. :(

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.