Ошибка после использования команды 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.