Показать полную графическую версию : [решено] Как найти строку в блоке вывода bat, но вставить другую?
Mancoffee
23-10-2024, 08:29
Есть вывод команды bcdedit
Приложение микропрограммы (101fffff)
-------------------------------
идентификатор {08466ee1-90f9-11ef-a538-806e6f6e6963}
device partition=\Device\HarddiskVolume13
path \EFI\UBUNTU\SHIMX64.EFI
description ubuntu
Приложение микропрограммы (101fffff)
-------------------------------
идентификатор {58ec2b43-90b8-11ef-a537-806e6f6e6963}
device partition=H:
path \EFI\BOOT\BOOTX64.EFI
description UEFI OS
Приложение микропрограммы (101fffff)
-------------------------------
идентификатор {58ec2b44-90b8-11ef-a537-806e6f6e6963}
device partition=I:
path \EFI\BOOT\BOOTX64.EFI
description UEFI OS
нужно найти идентификатор требуемой ОС и вставить её во вторую команду, но ИД находится перед названием ОС.
Как это сделать?
Можете на пальцах показать, что нужно взять и куда нужно вставить?
Mancoffee
24-10-2024, 07:55
Можете на пальцах показать, что нужно взять и куда нужно вставить? »
Взять нужно это {08466ee1-90f9-11ef-a538-806e6f6e6963} (как пример) и вставить в
bcdedit /set {fwbootmgr} bootsequence ВставитьСюда
Но естественно, мне нужно сначала найти название ОС, которое имеет название ubuntu.
Типа такого?
Просто перебираем строки, где присваиваем идентификатор и ищем слово ubuntu во втором параметре:
@echo off
setlocal enableextensions enabledelayedexpansion
For /F "Tokens=1,2* Delims= " %%a In ('bcdedit') Do (
if %%a EQU идентификатор set "ID=%%b"
if %%b EQU ubuntu (
echo."bcdedit /set {fwbootmgr} bootsequence !ID!"
pause
exit /b
)
)
Mancoffee
24-10-2024, 09:38
Просто перебираем строки, где присваиваем идентификатор и ищем слово ubuntu во втором параметре: »
Попробовал
@echo off
setlocal enableextensions enabledelayedexpansion
For /F "Tokens=1,2* Delims= " %%a In ('bcdedit') Do (
if %%a EQU идентификатор set "ID=%%b"
if %%b EQU ubuntu (
echo."bcdedit /set {fwbootmgr} bootsequence !ID! && shutdown -r -f -t 0"
pause
exit /b
)
)
Чёт не хочет и команда по ходу даже не срабатывает, потому что рестарт не происходит.
Выполнение bcdedit требует повышенных прав.
В таком сценарии перезагрузки не будет, т.к. echo - это вывод на экран.
Mancoffee
24-10-2024, 09:45
Выполнение bcdedit требует повышенных прав. »
У меня отключен UAC.
Плюс из cmd выполняется такая строка
bcdedit /set {fwbootmgr} bootsequence {f749bee3-7ada-11ef-a4ee-806e6f6e6963} & shutdown -r -f -t 0
Попробовал перетаскиванием в cmd bat-файл, тоже ничего.
В таком сценарии перезагрузки не будет, т.к. echo - это вывод на экран. »
Сделал так
@echo off
setlocal enableextensions enabledelayedexpansion
For /F "Tokens=1,2* Delims= " %%a In ('bcdedit') Do (
if %%a EQU идентификатор set "ID=%%b"
if %%b EQU Arch (
echo."bcdedit /set {fwbootmgr} bootsequence !ID!"
pause
exit /b
)
)
shutdown /r /f /t 0
Рестартанулось, но Arch не загрузило. Загрузило по умолчанию Win10
Рестартанулось, но Arch не загрузило. Загрузило по умолчанию Win10 »
В таком сценарии перезагрузки не будет, т.к. echo - это вывод на экран. »
echo."bcdedit /set {fwbootmgr} bootsequence !ID!" »
В таком сценарии команда bcdedit не выполнится, а лишь строка отобразится на экране (используйте echo при тестировании сценария, что бы видеть и понимать, какая команда в итоге будет выполнена);
Пробуйте так:
@echo off
setlocal enableextensions enabledelayedexpansion
For /F "Tokens=1,2* Delims= " %%a In ('bcdedit') Do (
if %%a EQU идентификатор set "ID=%%b"
if %%b EQU Arch (
bcdedit /set {fwbootmgr} bootsequence !ID!
shutdown /r /f /t 0
)
)
У меня отключен UAC. »
Не рекомендуемый сценарий.
Mancoffee
24-10-2024, 10:19
В таком сценарии команда bcdedit не выполнится, а лишь строка отобразится на экране (используйте echo при тестировании сценария, что бы видеть и понимать, какая команда в итоге будет выполнена); »
Туплю :)
Не рекомендуемый сценарий. »
Таааа, такое, уже лет так 15 юзаю без UAC, проблем нет :)
До этого было всё и UAC и антивирус и чего ещё только не было и переустанавливался бывало по 5-6 раз на день :)
Попробовал вот так
@echo off
setlocal enableextensions enabledelayedexpansion
For /F "Tokens=1,2* Delims= " %%a In ('bcdedit') Do (
if %%a EQU идентификатор set "ID=%%b"
if %%b EQU Arch (
bcdedit /set {fwbootmgr} bootsequence !ID!
pause
exit /b
)
)
shutdown /r /f /t 0
Тоже предыдущий результат.
Попробовал с echo - пустой вывод. Так понимаю, что echo off мешает, убрал, белеберда какая-то получилась.
В таком сценарии команда bcdedit не выполнится »
белеберда какая-то получилась. »
Понял, нужно искать в bcdedit /enum firmare, а вставлять уже в нужную команду
Куда нужно вставить команды?
Т.к. в сценарии используется кириллические символы, убедитесь, что файл сценария сохранён в кодировке cp866.
Mancoffee
24-10-2024, 11:01
Т.к. в сценарии используется кириллические символы, убедитесь, что файл сценария сохранён в кодировке cp866. »
Да, так работает. Спасибо.
Есть проблема с Easy2Boot, у него два раздела и оба отображаются как UEFI OS, пробовал менять названия, но насколько я понял, UEFI материнки начинает "тупить" и менять эти названия, сначала на своё какое-то, по итогу возвращает в UEFI OS, наверное исходя из того, что он видит на самом файле, который лежит в разделе.
Но эти два раздела всегда идут вместе и порядок не меняется. Можно ли их как-то обозначить в скрипте раздельно?
0 : Windows 10 Р?Р?С?Р?Р°
1 : rEFInd Р?Р?С?Р?Р°
2 : Windows 7 Р?Р?С?Р?Р°
3 : Kubuntu Р?Р?С?Р?Р°
4 : UEFI Shell Р?Р?С?Р?Р°
5 : Arch Р?Р?С?Р?Р°
6 : Windows Boot Manager Р?Р?С?Р?Р°
7 : ubuntu Р?Р?С?Р?Р°
8 : UEFI OS Р?Р?С?Р?Р°
9 : UEFI OS Р?Р?С?Р?Р°
10 : Hard Drive Р?Р?С?Р?Р°
11 : USB HDD Р?Р?С?Р?Р°
12 : Network Card Р?Р?С?Р?Р°
В принципе и с Windows тоже самое, он любые версии обозначает как Windows Boot Manager , это у меня уже вручную переименованные, но всё равно биос материнки либо меняет их, либо дублирует с оригинальным названием.
Можно ли их как-то обозначить в скрипте раздельно? »
Покажите полный вывод этих проблемных записей.
Как вариант, найти тот параметр, который будет отличаться в этих записях.
Т.е. опираться не на description , а на что-то другое и/ или комбинацию параметров;
пробовал менять названия »
Каким образом меняли? Попробуйте способом копирования с помощью bcdedit.
Mancoffee
24-10-2024, 11:31
Т.е. опираться не на description , а на что-то другое и/ или комбинацию параметров; »
Ну да, в принципе по device самый лучший вариант.
Приложение микропрограммы (101fffff)
-------------------------------
идентификатор {58ec2b43-90b8-11ef-a537-806e6f6e6963}
device partition=\Device\HarddiskVolume18
path \EFI\BOOT\BOOTX64.EFI
description UEFI OS
Приложение микропрограммы (101fffff)
-------------------------------
идентификатор {58ec2b44-90b8-11ef-a537-806e6f6e6963}
device partition=\Device\HarddiskVolume19
path \EFI\BOOT\BOOTX64.EFI
description UEFI OS
Попробуйте способом копирования с помощью bcdedit. »
Копирования чего и куда?
Менял с помощью bcdedit
bcdedit /set {408dc4d5-903f-11ef-a533-806e6f6e6963} description "Kubuntu from LEVEN"
Копирования чего и куда? »
Например, не изменять description существующей записи, а выполнить копирование:
bcdedit /copy /?
Ну да, в принципе по device самый лучший вариант. »
Сделали, добились желаемого?
Mancoffee
24-10-2024, 12:29
Например, не изменять description существующей записи, а выполнить копирование: »
Не, тоже самое, о чём я говорил. Поменяло на "UEFI: ACASIS, Partition 1", после первой перезагрузки, потом ещё раз или два рестарт и будет прежнее.
Сделали, добились желаемого? »
Сделал так
@echo off
setlocal enableextensions enabledelayedexpansion
For /F "Tokens=1,2* Delims= " %%a In ('bcdedit') Do (
if %%a EQU device set "ID=%%b"
if %%b EQU partition=\Device\HarddiskVolume2 (
echo."bcdedit /set {fwbootmgr} bootsequence !ID!"
pause
exit /b
)
)
Не подхватывает строку. Редактор показывает, что неправильный синтаксис. Пробовал строку с partition в кавычки брать (и оставить только HardDisk...), не помогает. Наверное чёт экранировать нужно.
Не подхватывает строку. Редактор показывает, что неправильный синтаксис. Пробовал строку с partition в кавычки брать (и оставить только HardDisk...), не помогает. Наверное чёт экранировать нужно. »
Можно всю строку device сравнивать, например:
@echo off
setlocal enableextensions enabledelayedexpansion
For /F "Tokens=1,2* Delims= " %%a In ('bcdedit') Do (
if %%a EQU идентификатор set "ID=%%b"
if "%%b" EQU "partition=\Device\HarddiskVolume2" (
echo."bcdedit /set {fwbootmgr} bootsequence !ID!"
)
if "%%b" EQU "partition=H:" (
echo."bcdedit /set {fwbootmgr} bootsequence !ID!"
)
)
pause
Mancoffee
24-10-2024, 13:13
Можно всю строку device сравнивать »
Ничего не выдаёт.
Там наверное ошиблись, не идентификатор, а device нужно прописывать?
Но пробовал и так, и так.
@echo off
setlocal enableextensions enabledelayedexpansion
For /F "Tokens=1,2* Delims= " %%a In ('bcdedit') Do (
if %%a EQU идентификатор set "ID=%%b"
if "%%b" EQU "partition=\Device\HarddiskVolume13" (
echo."bcdedit /set {fwbootmgr} bootsequence !ID!"
pause
exit /b
)
)
Согласно Ваших исходных данных, выполнив этот сценарий, отобразится следующая строка, после нажатия клавиши окно командного интерпретатора закроется:
"bcdedit /set {fwbootmgr} bootsequence {08466ee1-90f9-11ef-a538-806e6f6e6963}"
Mancoffee
24-10-2024, 14:18
выполнив этот сценарий, отобразится следующая строка »
Не, ничего нет
https://s01.pic4net.com/dt-8YP8H4.jpeg (https://s01.pic4net.com/di-8YP8H4.jpeg) https://s01.pic4net.com/dt-H1T09L.jpeg (https://s01.pic4net.com/di-H1T09L.jpeg)
И ожидания для нажатия клавиши тоже нет.
Т.к. в сценарии используется кириллические символы, убедитесь, что файл сценария сохранён в кодировке cp866. »
https://i.imgur.com/dLkcOt7.png
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.