Dosya adını ileterek bir uygulamadan bir pencereyi nasıl kapatabilirim?


9

Mac OS X'ten Önizleme uygulamasını belirli bir pencereyi kapatmasını söyleyen bir Applescript tabanlı kabuk komutu üretmeye çalışıyorum.

#!/bin/sh

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

Ama bu işe yaramıyor: Hata mesajını alıyorum

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

İlgili soru: .bash_profile dosyamda tanımlanan bir diğer ad kullanarak OS X uygulamasını komut satırından nasıl kapatabilirim?


Bu beklendiği gibi çalışmalıdır. Senaryonuzu tam olarak nasıl çağırıyorsunuz? Not: Betiğiniz belirli bir pencereyi kapatmaz. Uygulamadan çıkacak ve böylece uygulamanın açık olabileceği tüm belge pencerelerini kapatacaktır. Belirli bir belgeyi kapatmak için uygulama açılmış ancak uygulamadan çıkmamak için farklı bir komut dosyasına ihtiyacınız var. Çoğu uygulama son belge pencereleri kapatıldığında kapanır, ancak hepsi bunu yapmaz - bu aynı zamanda kullandığınız OS X sürümüne de bağlıdır.
Ocak'ta 13

@slhck: "Uygulamanın açtığı belirli bir belgeyi kapat ama uygulamadan çıkma" tam olarak ihtiyacım olan şey. Böyle bir "farklı senaryo" nun açıklandığı bir yeri biliyor musunuz?
Ewan Delanoy

Yanıtlar:


10

AppleScript komutlarını kabul etmek için Preview.app alma

Varsayılan olarak, Önizleme gerekli sözlüğü eksik olduğu için AppleScripting Önizleme çalışmaz. Bunu düzeltmek için Lauri'nin Preview.app ayarını açıklayan cevabını burada kontrol edin NSAppleScriptEnabled.

Preview.app uygulamasından çıkın, ardından bir terminal açın ve şunu girin:

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


Uygulamadan bir pencereyi kapatma

1) Pencere dizinine veya pencerenin adına göre

Adlandırılmış herhangi bir uygulamanın penceresini kapatma komutu şu şekilde olur:

tell application "Preview" to close window 1

… Veya adlandırılmış bir belge penceresini kapatmak istiyorsanız, örneğin foo.jpg:

"Önizleme" uygulamasını kapatmasını söyleyin (adı " foo.jpg " olan her pencere )

Yani, kabuk betiğinizde şöyle olurdu:

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

Burada, betiğe iletilen ilk argüman kapatmak istediğiniz pencerenin adıdır, örn ./quit.sh foo.jpg. Dosyanız boşluk içeriyorsa, dosya adını belirtmeniz gerektiğini unutmayın, örn ./quit.sh "foo bar.jpg".

Veya herhangi bir uygulamadan rastgele pencereleri kapatmak istiyorsanız, şunu kullanın:

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

Burada, ./quit.sh Preview foo.jpgörneğin kullanırsınız .

2) Dosya adına göre

Belirli bir belgeye ait olan ancak dosya adını sağlayan bir pencereyi kapatmak istiyorsanız, başka bir şeye ihtiyacınız vardır. Bunun nedeni, çok sayfalı bir PDF'nin görüntülenebilmesidir foo.pdf (Page 1 of 42), ancak yalnızca foo.pdfAppleScript'e geçmek istersiniz .

Burada pencerelerden tekrarlıyoruz ve dosya adlarını senaryoya iletilen argümanla karşılaştırıyoruz:

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

Şimdi sadece arayabilirsiniz ./quit.sh foo.pdf. Genelleştirilmiş bir şekilde, adlandırılmış belge pencerelerine sahip tüm uygulamalar için şu şekilde olur:

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


Uyarı: Otomatik kapanma Preview.app

Preview.app, son belge penceresi kapatıldığında otomatik olarak çıkan bu uygulamalardan biridir. Hafızadan tasarruf etmek ve "temizlemek" için bunu yapar. Bu davranışı devre dışı bırakmak için aşağıdakileri çalıştırın:

defaults write -g NSDisableAutomaticTermination -bool TRUE

Tabii ki, değişikliği geri almak TRUEiçin FALSE.


Komut dosyaları yerine işlevleri kullanma

Son olarak, komut dosyalarınızı her zaman kabuğunuzda bulunan bir işleve koymanızı öneririm. Bunu yapmak için, komut dosyalarını bilgisayarınıza ekleyin ~/.bash_profile. Bu dosyayı yoksa oluşturun.

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 profilinizi kaydedip kabuğu yeniden başlattıktan sonra cw Preview foo.pdf, her yerden arayabilirsiniz .


Bunu denedim. Bu sefer hata mesajı almıyorum, ancak komut dosyası hala çalışmıyor: pencere ekranda görünür durumda kalıyor.
Ewan Delanoy

Benim için çalıştı. Preview.app'da bir belge açar ve AppleScript Editor'ü açar ve tell application "Preview" to windowsgirerseniz, bu size herhangi bir sonuç verir mi? Tam olarak hangi senaryoyu çalıştırıyorsunuz?
Ocak'ta 13

AppleScript düzenleyicisini kullanmıyorum, OP'de açıklandığı gibi .sh dosyasında depolanan bir bash komut dosyasında yalnızca "katıştırılmış elma kodu" kullanıyorum.
Ewan Delanoy

Aslında, genellikle kabuk betiklerinden oldukça memnunum ve bu benim ilk el yazmam. Son yorumunuzda önerilerinizi yaptım ve şunu aldım: "{Preview"} uygulamasının pencere kimliği 113 "yanıt olarak. Almam gereken bu mu?
Ewan Delanoy

Ayrıca, << derleme uygulaması "musixdoc.pdf" >> applecript editörü ile kapatmak için "Önizleme" söyle, o da çalışmıyor: musixdoc.pdf penceresi ekranda görünür kalır.
Ewan Delanoy

0

Slhck'in cevabı iyi ve kapsamlı görünüyor. Üçüncü kod satırını uygularken dikkatli olun :

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

'Görünüşe göre' Önizleme'nin her lansmanda aşağıdakilerle çökmesine neden oldu:

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

-fKod işareti kılavuzuna göre, bu , 'kod işaretini değiştirmeye ve mevcut imzayı' zorunlu kılıyor ve 'kodu -sverilen yolda imzalamak' ... bu durumda-

Görünüşe göre, Önizleme artık yanlış imzalanmış ve kullanılamıyor. :(

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.