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


9

Mac OS Xからプレビューアプリケーションに特定のウィンドウを閉じるように指示する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 2013年

@slhck:「アプリケーションが開いた特定のドキュメントを閉じるが、アプリケーション自体は終了しない」がまさに私が必要とするものです。そのような「異なるスクリプト」が説明されている場所を知っていますか?
Ewan Delanoy、2013年

回答:


10

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

デフォルトでは、プレビューに必要な辞書がないため、AppleScriptingプレビューは機能しません。これを修正するには、Preview.appの設定を説明するLauriの回答をこちらで確認してください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、どこからでも呼び出すことができます。


私はこれを試しました。今回はエラーメッセージは表示されませんが、スクリプトはまだ機能しません。ウィンドウは画面に表示されたままです。
Ewan

それは私のために働いた。Preview.appでドキュメントを開いてからAppleScript Editorを開いてと入力するとtell application "Preview" to windows、結果は得られますか?正確にどのようなスクリプトを実行していますか?
slhck 2013年

私はAppleScriptエディターを使用せず、OPで説明されているように、.shファイルに格納されているbashスクリプトで「埋め込まれたApplescriptコード」のみを使用します。
Ewan Delanoy、2013年

実際、私は通常、シェルスクリプトに非常に満足しています。これが初めてのApplescriptです。私はあなたの最後のコメントであなたが助言したことをしただけで、答えとして「{window id 113 of application "Preview"}」を得ました。それは私が手に入れるべきものですか?
Ewan Delanoy、2013年

また、アップルスクリプトエディタで<<アプリケーションに[プレビュー]を教えて「musixdoc.pdf」を閉じるように>>コンパイルした場合も、動作しません。musixdoc.pdfウィンドウは画面に表示されたままです。
Ewan

0

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

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指定されたパスでコードに署名する」ことです...この場合-

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.