Alihkan Bluetooth AppleScript tidak Bekerja di Yosemite


1

Sebelum meningkatkan ke Yosemite, saya menggunakan Keyboard Maestro untuk menjalankan Applescript ini dengan pintasan:

tell application "System Preferences"
    reveal pane "com.apple.preferences.Bluetooth"
end tell
tell application "System Events" to tell process "System Preferences"
    click button 6 of window 1
end tell
quit application "System Preferences"

Berperilaku seperti yang diharapkan, beralih bluetooth setiap kali saya menekan pintasan saya.

Ini tidak lagi bekerja dengan Yosemite, saya yakin itu ada hubungannya dengan Apple mengubah panel System Preferences atau urutan ikon, tetapi saya tidak yakin apa yang harus diubah. Pintasan Keyboard Maestro aku s memohon file, karena saya mendengar suara yang saya tetapkan untuknya, jadi pasti ada sesuatu dengan skrip.

Inilah yang saya dapatkan di bawah "Balasan" ketika saya menjalankan ini di Editor Skrip Apple:

tell application "System Preferences"
    reveal pane "com.apple.preferences.Bluetooth"
        --> missing value
end tell
tell application "System Events"
    click button 6 of window 1 of process "System Preferences"
        --> button 6 of window "Bluetooth" of application process "System Preferences"
end tell
tell application "Script Editor"
    quit
end tell

Pembaruan:

Jelas bukan panel yang menyebabkan masalah. Untuk debug, saya mengubah kode ke:

tell application "System Preferences"
    set current pane to pane id "com.apple.preferences.bluetooth"
end tell

Dan itu dengan benar membuka panel Bluetooth. Sekarang yang tersisa adalah memikirkan tindakan apa yang ingin saya jalankan di panel ini:

enter image description here

Pembaruan pada solusi: Terima kasih lebih jauh! Keduanya markhunte dan lebih jauh Solusi berhasil bagi saya, tetapi saya memilih yang terakhir karena lebih mirip dengan kode saya. Saya kira Anda tidak dapat memilih dua jawaban "terbaik". Saya berharap ada solusi untuk membuatnya bekerja tanpa memunculkan panel preferensi (secara visual) seperti naskah saya dengan Mavericks, tetapi keduanya harus cukup baik.


apakah Anda mencoba menetapkan ulang jalan pintas?
Buscar웃

Tidak, dan saya juga memperbarui pertanyaan saya dengan ini: "Pintasan itu sendiri memanggil file, karena saya mendengar suara yang saya tetapkan untuk itu, jadi pasti ada sesuatu dengan skrip."
zerohedge

Baru saja mencoba skrip Anda (bagian 1) di Mavericks saya dan dapatkan kesalahan yang sama (nilai yang hilang)! Jadi bukan Yosemite!
Buscar웃

Yah, Anda jelas mendapat hasil yang sama karena ada sesuatu yang berubah di Yosemite: Entah nama atau referensi panel, atau indeks untuk tombol yang perlu diklik. Aku hanya tidak tahu yang mana.
zerohedge

Saya TIDAK punya Yosemite! Saya menggunakan skrip Anda di Mavericks saya (10.9.5) dengan masalah yang sama menunjukkan. Itu tidak berfungsi pada Mavericks saya.
Buscar웃

Jawaban:


1

Diperbarui / Jawaban Lebih Baik:

1) Skrip baru ini tidak menyala.

2) Untuk alasan yang tidak diketahui manusia dan logika (atau hanya saya), applescript kadang-kadang / hampir selalu gagal Matikan Bluetooth , jika Jendela Preferensi Sistem ada di latar belakang. Alih-alih mematikan, yang sebenarnya terjadi adalah Bluetooth segera mengaktifkan kembali dirinya sendiri, sehingga panel ada di a segar negara: ON, tapi tidak ada koneksi

Untuk mengatasinya, salah satu cara untuk membawa SysPref ke depan, seperti pada jawaban aslinya. Atau, jalankan loop yang mengklik tombol lagi (atau untuk yang ke-3) sampai Bluetooth benar-benar mati. Itu sebabnya ada dua variabel dan satu loop dalam skrip. Ini harus membuat skrip lebih dapat diandalkan. statName variabel mencatat status asli. Loop akan terus mengklik tombol hingga statusnya berubah. failSafe memastikan skrip tidak akan berjalan selamanya jika terjadi kesalahan. Semua dengan biaya kode estetika.

tell application "System Events"

    tell process "System Preferences"
        activate
    end tell

    tell application "System Preferences"
        set current pane to pane "com.apple.preferences.Bluetooth"
    end tell

    tell process "System Preferences"

        set statName to name of button 3 of window 1 as string
        set failSafe to 0

        repeat until statName is not name of button 3 of window 1 as string ¬
            or failSafe is 10
            click button 3 of window 1
            set failSafe to failSafe + 1
            delay 0.1
        end repeat

    end tell

    tell application "System Preferences"
        quit
    end tell

end tell

Jawaban asli:

tell application "System Preferences"
    activate --Change 1/2
    reveal pane "com.apple.preferences.Bluetooth"
end tell
tell application "System Events" to tell process "System Preferences"
    click button 3 of window 1 --Change 2/2
end tell
quit application "System Preferences"

Dari Inspektur Aksesibilitas :

enter image description here

button 3 dalam item no.6 pada daftar. Tombol 6 adalah no.11 dalam daftar. Saat Anda menelepon button 6 Jendela Preferensi pergi Genie. Kurasa Mavericks memasang semua tombol di depan.


bagaimana Anda mendapatkan daftar?
Buscar웃

Terima kasih, tetapi ini hanya berfungsi sekali . Ini akan mengaktifkan Bluetooth saat masuk ketika saya menjalankan file, tetapi tidak akan mematikannya, juga tidak akan menyalakannya setelah saya menyalakannya secara manual.
zerohedge

Terima kasih. Disana apa saja cara untuk membuatnya berfungsi tanpa menampilkan panel Preferensi sama sekali?
zerohedge

Hmm, saya bertanya-tanya mengapa itu berhasil dengan Mavericks saat itu. Bagaimanapun, tolong ubah jawaban Anda dengan komentar aktifkan sehingga saya dapat memilihnya dan memilihnya sebagai "terbaik".
zerohedge

Saya melihat Anda telah menambahkan —change1 / 2 dan 2/2 di sana, apakah itu sesuatu yang juga harus saya miliki? Saya berasumsi itu hanya untuk orang-orang yang tahu di mana Anda membuat perubahan tetapi mungkin membingungkan bagi orang lain yang hanya akan menyalin-menempelkan jawabannya.
zerohedge

2

Saya telah belajar banyak di sini, saya harap kontribusi ini membantu seseorang juga! Saya menemukan menggunakan "luncurkan" alih-alih "mengaktifkan" akan membuka aplikasi secara jelas, tetapi tidak sebagai jendela latar depan. Trik lain, atau setidaknya "hal rapi yang saya pelajari baru-baru ini dimungkinkan", adalah menggunakan pengulangan kosong untuk menunggu jendela dimuat (dan tombolnya ada) alih-alih nilai "delay", yang juga saya gunakan untuk memverifikasi perubahan berfungsi sebelum menampilkan pemberitahuan. Sisa kode saya adalah tentang mempertahankan status Preferensi Sistem jika sudah terbuka, atau berhenti, jika tidak.

    set bundleID to "com.apple.systempreferences"

-- Check for System Preferences running already
tell the application "System Events" to set runningApps to (bundle identifier of every application process)
if bundleID is in runningApps then
    set stayOpen to true
else
    set stayOpen to false
end if

tell application id "com.apple.systempreferences"
    -- Problem with this setting is that the toggle doesn't work if the prefPane is open in the background — the window /must/ be visible
    if not (stayOpen) then launch

    -- If it's already running, save the current prefPane for later
    if (stayOpen) then set prevPane to current pane

    set current pane to pane id "com.apple.preferences.bluetooth"
end tell

tell the application "System Events"
    -- An empty repeat loop to keep checking for the window
    -- Here I am lazy and don't use the identifier
    repeat until window "Bluetooth" of process "System Preferences" exists
    end repeat

    tell window "Bluetooth" of process "System Preferences"
        if button "Turn Bluetooth Off" exists then
            -- Click and wait for it to change, then send a notification
            click button "Turn Bluetooth Off"
            repeat until button "Turn Bluetooth On" exists
            end repeat
            display notification "Bluetooth Off"
        else
            click button "Turn Bluetooth On"
            repeat until button "Turn Bluetooth Off" exists
            end repeat
            display notification "Bluetooth On"
        end if
    end tell

end tell

tell application id "com.apple.systempreferences"
    if (stayOpen) then
        if prevPane is not missing value then set current pane to prevPane
    else if not (stayOpen) then
        quit
    end if
end tell

2

Mengaktifkan atau menonaktifkan sederhana yang tidak perlu memeriksa status terlebih dahulu.

property thePane : "com.apple.preferences.bluetooth"

tell application "System Preferences"
    activate
    set the current pane to pane id thePane
    --delay 1
end tell

tell application "System Events"
    tell application process "System Preferences"
        try
            click button "Turn Bluetooth Off" of window "Bluetooth"
        on error
            click button "Turn Bluetooth On" of window "Bluetooth"
        end try
    end tell
end tell

tell application "System Preferences" to quit

Terima kasih, ini berfungsi untuk beralih. Tetapi tidak seperti skrip sebelumnya, yang sama sekali tidak memunculkan preferensi sistem - yang satu ini membiarkan panel Bluetooth terlihat di akhir proses.
zerohedge

@zerohedge menambahkan panggilan keluar. Anda juga dapat mengambil penundaan jika Anda tidak membutuhkannya.
markhunte

1

Inilah jawaban saya:

tell application "System Preferences"
    reveal pane id "com.apple.preferences.Bluetooth"
    -- activate

    set the current pane to pane id "com.apple.preferences.Bluetooth"

    try
        tell application "System Events" to tell process "System Preferences"
            click button "Turn Bluetooth Off" of window "Bluetooth"

            click button "Turn Bluetooth Off" of sheet 1 of window "Bluetooth" of application process "System Preferences" of application "System Events"
        end tell

        delay 1

    on error
        tell application "System Events" to tell process "System Preferences"
            click button "Turn Bluetooth On" of window "Bluetooth"
            quit
        end tell

    end try

end tell

1

Berikut ini adalah skrip beralih Bluetooth sederhana yang digunakan blueutil (tersedia melalui Homebrew), tidak ada skrip UI. Sesuaikan blueutil variabel sesuai kebutuhan untuk menunjuk ke blueutil biner jika Anda tidak menginstal melalui Homebrew. Ini didasarkan secara longgar pada skrip lama yang saya taruh di sekitarnya yang menyertakan pemberitahuan Growl dan mungkin awalnya dari http://macosxhints.com (MENINGGAL DUNIA).

set blueutil to "/usr/local/bin/blueutil"
set powerStatus to do shell script blueutil & " power"

if powerStatus is "1" then
    do shell script blueutil & " power 0"
else if powerStatus is "0" then
    do shell script blueutil & " power 1"
end if
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.