web-dev-qa-db-ja.com

ファイル名を渡して、アプリケーションからウィンドウを閉じるにはどうすればよいですか?

Mac OSXのプレビューアプリケーションに特定のウィンドウを閉じるように指示する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アプリケーションを閉じるにはどうすればよいですか?

9
Ewan Delanoy

AppleScriptコマンドを受け入れるようにPreview.appを取得する

デフォルトでは、プレビューに必要な辞書がないため、AppleScriptingプレビューは機能しません。これを修正するには、 Lauriの回答はこちら を確認してください。これは、Preview.appのNSAppleScriptEnabledの設定について説明しています。

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.pdf_をAppleScriptに渡したいだけだからです。

ここでは、ウィンドウを繰り返し処理し、ファイル名をスクリプトに渡された引数と比較します。

_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は、最後のドキュメントウィンドウが閉じられると自動的に終了するこれらのアプリケーションの1つです。これは、メモリを節約して「クリーンアップ」するために行われます。この動作を無効にするには、次を実行します。

_defaults write -g NSDisableAutomaticTermination -bool TRUE
_

もちろん、これを元に戻すには、TRUEFALSEに変更します。


スクリプトの代わりに関数を使用する

最後に、シェルで常に使用できる関数にスクリプトを配置することをお勧めします。これを行うには、スクリプトを_~/.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_を呼び出すことができます。

10
slhck

Slhckの答えはよく、完全に見えます。 番目のコード行を実行することに注意してください

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

'は、次のように起動するたびにプレビューがクラッシュしたようです。

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

コードサインマニュアルによると、その-fは、 'コード署名を置き換えて既存の署名'と-sは、「指定されたパスでコードに署名する」ことです。この場合は-

どうやら、プレビューは正しく署名されておらず、使用できなくなっています。 :(

0
David C