Ошибка после использования команды Mac OS bless: "нет загрузочного устройства"

Я создал appleScript для загрузки из снежного барса в льва, но команда благословения не выполняется. Вот команда:

do shell script "bless -mount /Volumes/bootdrive/ -legacy -setBoot -nextonly" password "mypassword" with administrator privileges

При перезагрузке я получаю черный экран с ошибкой "Нет загрузочного устройства". Я выполнил команду непосредственно в терминале как пользователь root (а не как appleScript) и получил тот же результат. И да, я трижды проверил, что путь к диску, который я использую, правильный и загрузочный.

Есть идеи, в чем проблема?

2 ответа

У меня нет подходящей настройки для тестирования, но -legacy вариант выглядит очень подозрительно для меня. Согласно справочной странице, она используется для поддержки операционных систем на основе BIOS, а не OS X. Попробуйте удалить -legacy и посмотрим, работает ли он лучше.

Рабочий раствор

SIP был первой проблемой, с которой я столкнулся на Биг-Суре. Выключить похоже плохая идея. Вторая проблема заключалась в том, что у элементов списка целевых томов нет действий. Что делает невозможным щелкнуть по ним с помощью функций щелчка или «щелчка», возможно, из-за некоторых новых дополнительных средств защиты на Big Sur. Click with AST и другие скрипты также не работают из-за новых ограничений MacOS. Единственный способ, который я нашел, - использовать python click (но это приводит к небольшой задержке, пока скрипт выбирает целевой объем).

Итак, вот полностью автоматическое переключение:

      property targetVolume : "BOOTCAMP" # find name of required volume inside System Preference > Startup Disk
property passwordValue : "yourSystemPassword" # Can be empty

tell application "System Events"
    tell application "System Preferences"
        set current pane to pane id "com.apple.preference.startupdisk"
        activate
    end tell
    tell application process "System Preferences"
        tell window "Startup Disk"
            set volumePosition to {0, 0}
            set lockFound to false
            
            # Check if auth required
            set authButtonText to "Click the lock to make changes."
            if exists button authButtonText then
                click button authButtonText
                
                # Wait for auth modal
                set unlockButtonText to "Unlock"
                repeat
                    if (exists sheet 1) and (exists button unlockButtonText of sheet 1) then exit repeat
                end repeat
                
                # Autofill password if setted
                if passwordValue is not equal to "" then
                    set value of text field 1 of sheet 1 to passwordValue
                    click button unlockButtonText of sheet 1
                end if
                
                # Wait for auth success
                repeat
                    if exists button "Click the lock to prevent further changes." then exit repeat
                end repeat
            end if
            
            # Wait until loading volumes list
            repeat
                if exists group 1 of list 1 of scroll area 1 then exit repeat
            end repeat
            
            # Click on target volume (posible a slight delay because of shell script executing)
            repeat with m in (UI element of list 1 of scroll area 1)
                if (value of first static text of m = targetVolume) then
                    tell static text targetVolume of m
                        set volumePosition to position
                    end tell
                end if
            end repeat
            set volumePositionX to item 1 of volumePosition
            set volumePositionY to item 2 of volumePosition
            my customClick(volumePositionX, volumePositionY)
            
            click button "Restart…"
            
            # Wait for restart modal appears
            repeat
                if (exists sheet 1) and (exists value of first static text of sheet 1) then exit repeat
            end repeat
            
            click button "Restart" of sheet 1
        end tell
    end tell
end tell

# shell script to make click work on target volume
on customClick(x, y)
    do shell script " 

/usr/bin/python <<END

import sys

import time

from Quartz.CoreGraphics import * 

def mouseEvent(type, posx, posy):

          theEvent = CGEventCreateMouseEvent(None, type, (posx,posy), kCGMouseButtonLeft)

          CGEventPost(kCGHIDEventTap, theEvent)

def mousemove(posx,posy):

          mouseEvent(kCGEventMouseMoved, posx,posy);

def mouseclick(posx,posy):

          mouseEvent(kCGEventLeftMouseDown, posx,posy);

          mouseEvent(kCGEventLeftMouseUp, posx,posy);

ourEvent = CGEventCreate(None); 

currentpos=CGEventGetLocation(ourEvent);             # Save current mouse position

mouseclick(" & x & "," & y & ");

mousemove(int(currentpos.x),int(currentpos.y));      # Restore mouse position

END"
end customClick

on simpleEncryption(_str)
    set x to id of _str
    repeat with c in x
        set contents of c to c + 100
    end repeat
    return string id x
end simpleEncryption

on simpleDecryption(_str)
    set x to id of _str
    repeat with c in x
        set contents of c to c - 100
    end repeat
    return string id x
end simpleDecryption

Вам просто нужно изменить два свойства targetVolume и passwordValue . Пароль может быть пустым, и в этом случае вы можете ввести его вручную. Затем просто скопируйте этот скрипт, вставьте его в редактор скриптов и экспортируйте через File -> Export -> file format - Application, выберите Run-only -> Save. Вы можете проделать один и тот же процесс для всех ваших систем, например Big Sur 1, Big Sur 2, Bootcamp.

Другие вопросы по тегам