Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Как найти строку в блоке вывода bat, но вставить другую? (http://forum.oszone.net/showthread.php?t=355800)

Mancoffee 23-10-2024 08:29 3031918

Как найти строку в блоке вывода bat, но вставить другую?
 
Есть вывод команды 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

нужно найти идентификатор требуемой ОС и вставить её во вторую команду, но ИД находится перед названием ОС.
Как это сделать?

NickM 23-10-2024 13:28 3031925

Можете на пальцах показать, что нужно взять и куда нужно вставить?

Mancoffee 24-10-2024 07:55 3031953

Цитата:

Цитата NickM
Можете на пальцах показать, что нужно взять и куда нужно вставить? »

Взять нужно это
Код:

{08466ee1-90f9-11ef-a538-806e6f6e6963}
(как пример) и вставить в
Код:

bcdedit /set {fwbootmgr} bootsequence ВставитьСюда
Но естественно, мне нужно сначала найти название ОС, которое имеет название ubuntu.

NickM 24-10-2024 09:03 3031958

Типа такого?

Просто перебираем строки, где присваиваем идентификатор и ищем слово 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 3031959

Цитата:

Цитата NickM
Просто перебираем строки, где присваиваем идентификатор и ищем слово 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
        )
)

Чёт не хочет и команда по ходу даже не срабатывает, потому что рестарт не происходит.

NickM 24-10-2024 09:41 3031960

Выполнение bcdedit требует повышенных прав.

В таком сценарии перезагрузки не будет, т.к. echo - это вывод на экран.

Mancoffee 24-10-2024 09:45 3031961

Цитата:

Цитата NickM
Выполнение bcdedit требует повышенных прав. »

У меня отключен UAC.
Плюс из cmd выполняется такая строка
Код:

bcdedit /set {fwbootmgr} bootsequence {f749bee3-7ada-11ef-a4ee-806e6f6e6963} & shutdown -r -f -t 0
Попробовал перетаскиванием в cmd bat-файл, тоже ничего.

Цитата:

Цитата NickM
В таком сценарии перезагрузки не будет, т.к. 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

NickM 24-10-2024 10:04 3031964

Цитата:

Цитата Mancoffee
Рестартанулось, но Arch не загрузило. Загрузило по умолчанию Win10 »

Цитата:

Цитата NickM
В таком сценарии перезагрузки не будет, т.к. echo - это вывод на экран. »

Цитата:

Цитата Mancoffee
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
        )
)

Цитата:

Цитата Mancoffee
У меня отключен UAC. »

Не рекомендуемый сценарий.

Mancoffee 24-10-2024 10:19 3031965

Цитата:

Цитата NickM
В таком сценарии команда bcdedit не выполнится, а лишь строка отобразится на экране (используйте echo при тестировании сценария, что бы видеть и понимать, какая команда в итоге будет выполнена); »

Туплю :)
Цитата:

Цитата NickM
Не рекомендуемый сценарий. »

Таааа, такое, уже лет так 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 мешает, убрал, белеберда какая-то получилась.

Цитата:

Цитата NickM
В таком сценарии команда bcdedit не выполнится »

Цитата:

Цитата Mancoffee
белеберда какая-то получилась. »

Понял, нужно искать в
Код:

bcdedit /enum firmare
, а вставлять уже в нужную команду
Куда нужно вставить команды?

NickM 24-10-2024 10:25 3031967

Т.к. в сценарии используется кириллические символы, убедитесь, что файл сценария сохранён в кодировке cp866.

Mancoffee 24-10-2024 11:01 3031970

Цитата:

Цитата NickM
Т.к. в сценарии используется кириллические символы, убедитесь, что файл сценария сохранён в кодировке 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 , это у меня уже вручную переименованные, но всё равно биос материнки либо меняет их, либо дублирует с оригинальным названием.

NickM 24-10-2024 11:16 3031971

Цитата:

Цитата Mancoffee
Можно ли их как-то обозначить в скрипте раздельно? »

Покажите полный вывод этих проблемных записей.

Как вариант, найти тот параметр, который будет отличаться в этих записях.

Т.е. опираться не на description , а на что-то другое и/ или комбинацию параметров;

Цитата:

Цитата Mancoffee
пробовал менять названия »

Каким образом меняли? Попробуйте способом копирования с помощью bcdedit.

Mancoffee 24-10-2024 11:31 3031972

Цитата:

Цитата NickM
Т.е. опираться не на 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

Цитата:

Цитата NickM
Попробуйте способом копирования с помощью bcdedit. »

Копирования чего и куда?

Менял с помощью bcdedit
Код:

bcdedit /set {408dc4d5-903f-11ef-a533-806e6f6e6963} description "Kubuntu from LEVEN"

NickM 24-10-2024 12:13 3031974

Цитата:

Цитата Mancoffee
Копирования чего и куда? »

Например, не изменять description существующей записи, а выполнить копирование:
Код:

bcdedit /copy /?
Цитата:

Цитата Mancoffee
Ну да, в принципе по device самый лучший вариант. »

Сделали, добились желаемого?

Mancoffee 24-10-2024 12:29 3031976

Цитата:

Цитата NickM
Например, не изменять description существующей записи, а выполнить копирование: »

Не, тоже самое, о чём я говорил. Поменяло на "UEFI: ACASIS, Partition 1", после первой перезагрузки, потом ещё раз или два рестарт и будет прежнее.
Цитата:

Цитата NickM
Сделали, добились желаемого? »

Сделал так
Код:

@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...), не помогает. Наверное чёт экранировать нужно.

NickM 24-10-2024 13:07 3031977

Цитата:

Цитата Mancoffee
Не подхватывает строку. Редактор показывает, что неправильный синтаксис. Пробовал строку с 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 3031980

Цитата:

Цитата NickM
Можно всю строку device сравнивать »

Ничего не выдаёт.

Там наверное ошиблись, не идентификатор, а device нужно прописывать?
Но пробовал и так, и так.

NickM 24-10-2024 13:26 3031983

Код:

@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 3031986

Цитата:

Цитата NickM
выполнив этот сценарий, отобразится следующая строка »

Не, ничего нет

И ожидания для нажатия клавиши тоже нет.

NickM 24-10-2024 14:31 3031987

Цитата:

Цитата NickM
Т.к. в сценарии используется кириллические символы, убедитесь, что файл сценария сохранён в кодировке cp866. »

Скрытый текст

Mancoffee 24-10-2024 14:48 3031988

Цитата:

Цитата NickM
кодировке cp866 »

Ну это помню, всё нормально.

NickM 24-10-2024 14:57 3031989

Цитата:

Цитата Mancoffee
Ну да, в принципе по device самый лучший вариант. »

Так, на ваших скринах же отчётливо видно, что этот самый device не уникальный, тогда, зачем за него цепляться?
Цитата:

Цитата NickM
Как вариант, найти тот параметр, который будет отличаться в этих записях.
Т.е. опираться не на description , а на что-то другое и/ или комбинацию параметров; »


Mancoffee 24-10-2024 14:59 3031990

Цитата:

Цитата NickM
Так, на ваших скринах же отчётливо видно, что этот самый device не уникальный, тогда, зачем за него цепляться? »

В смысле? Вот же уникальность - HarddiskVolume13
Ааа всё, я не обращал даже внимания, как так, одинаковые вольюмы ...

Так тогда не за что и цепляться, чтоб наверняка.

NickM 24-10-2024 15:05 3031991

Цитата:

Цитата Mancoffee
Так тогда не за что и цепляться, чтоб наверняка. »

Подумайте.

Или покажите полный вывод записей bcdedit, возможно, что что-нибудь и можно будет придумать. какую-нибудь уникальную комбинацию.

Mancoffee 24-10-2024 15:07 3031992

Цитата:

Цитата NickM
Или покажите полный вывод записей bcdedit, возможно, что что-нибудь и можно будет придумать. какую-нибудь уникальную комбинацию. »

Так тут нет над чем думать, всего-то четыре строки. На скринах и отдельным кодом, что до этого писал, это всё, что выдаёт.

Хотя чёт и с кодировкой не то, пишет вроде 866, но уже и тот вариант, что работал, уже не выдаёт ID, если echo приписать. Но если отключаю echo off, то в выводе нормальная кириллица, не кракозябры.

sov44 24-10-2024 15:16 3031993

Если проблема с запуском нужной ОС, наверное нужно добавить в код приоритет загрузки, типа
Код:

bcdedit bootsequence {08466ee1-90f9-11ef-a538-806e6f6e6963} /addfirst

Mancoffee 24-10-2024 15:18 3031994

Цитата:

Цитата sov44
Если проблема с запуском нужной ОС, наверное нужно добавить в код приоритет загрузки, типа »

Так дело не с приоритетом, а поиском в выводе.

NickM 24-10-2024 15:24 3031995

Цитата:

Цитата Mancoffee
Так тут нет над чем думать, всего-то четыре строки. На скринах и отдельным кодом, что до этого писал, это всё, что выдаёт. »

Когда не располагаешь всей информацией, то приходиться догадываться.

Вот и пример Вам выше, пжлст. - совпадение параметра device у некоторых записей.

Имея на руках весь вывод, эту ситуацию можно было бы обыграть в едином сценарии.

Mancoffee 24-10-2024 15:27 3031996

Цитата:

Цитата NickM
Имея на руках весь вывод, эту ситуацию можно было бы обыграть в едином сценарии. »

А, вы имеете ввиду полный список записей наверное ...
Скрытый текст
Код:

C:\Users\BlagoYar > bcdedit /enum firmware                                                                            15:17:02

Диспетчер загрузки микропрограмм
---------------------
идентификатор          {fwbootmgr}
displayorder            {aeb141a2-50f0-11ef-a44e-806e6f6e6963}
                        {92ad53ef-4fe7-11ef-a43f-00158312706e}
                        {8a70e99e-ce5d-11ee-a239-806e6f6e6963}
                        {fce77d1c-542f-11ef-a47d-806e6f6e6963}
                        {92ad53f0-4fe7-11ef-a43f-00158312706e}
                        {9fd5c12a-7f25-11ef-a4ff-806e6f6e6963}
                        {bootmgr}
                        {08466ee1-90f9-11ef-a538-806e6f6e6963}
                        {58ec2b43-90b8-11ef-a537-806e6f6e6963}
                        {58ec2b44-90b8-11ef-a537-806e6f6e6963}
                        {cd433883-b798-11ed-9f7d-806e6f6e6963}
                        {ea6a5a16-d6bf-11ee-a255-806e6f6e6963}
                        {b9bff08e-56e2-11ef-a494-806e6f6e6963}
timeout                1

Диспетчер загрузки Windows
--------------------
идентификатор          {bootmgr}
device                  partition=\Device\HarddiskVolume14
path                    \EFI\MICROSOFT\BOOT\BOOTMGFW.EFI
description            Windows Boot Manager
locale                  ru-RU
inherit                {globalsettings}
flightsigning          Yes
default                {current}
resumeobject            {e038f13c-daad-11ec-bbea-d45d64ba5434}
displayorder            {current}
toolsdisplayorder      {memdiag}
timeout                1

Приложение микропрограммы (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

Приложение микропрограммы (101fffff)
-------------------------------
идентификатор          {8a70e99e-ce5d-11ee-a239-806e6f6e6963}
device                  partition=\Device\HarddiskVolume13
path                    \EFI\MICROSOFT\BOOT\BOOTMGFW.EFI
description            Windows 7

Приложение микропрограммы (101fffff)
-------------------------------
идентификатор          {92ad53ef-4fe7-11ef-a43f-00158312706e}
device                  partition=\Device\HarddiskVolume13
path                    \EFI\REFIND\REFIND_X64.EFI
description            rEFInd

Приложение микропрограммы (101fffff)
-------------------------------
идентификатор          {92ad53f0-4fe7-11ef-a43f-00158312706e}
device                  partition=\Device\HarddiskVolume13
path                    \EFI\EFISHELL\SHELLX64.EFI
description            UEFI Shell

Приложение микропрограммы (101fffff)
-------------------------------
идентификатор          {9fd5c12a-7f25-11ef-a4ff-806e6f6e6963}
device                  partition=\Device\HarddiskVolume7
path                    \EFI\Arch\grubx64.efi
description            Arch

Приложение микропрограммы (101fffff)
-------------------------------
идентификатор          {aeb141a2-50f0-11ef-a44e-806e6f6e6963}
device                  partition=\Device\HarddiskVolume14
path                    \EFI\BOOT\BOOTX64.EFI
description            Windows 10

Приложение микропрограммы (101fffff)
-------------------------------
идентификатор          {b9bff08e-56e2-11ef-a494-806e6f6e6963}
description            Network Card

Приложение микропрограммы (101fffff)
-------------------------------
идентификатор          {cd433883-b798-11ed-9f7d-806e6f6e6963}
description            Hard Drive

Приложение микропрограммы (101fffff)
-------------------------------
идентификатор          {ea6a5a16-d6bf-11ee-a255-806e6f6e6963}
device                  unknown
path                    \EFI\MICROSOFT\BOOT\BOOTMGFW.EFI
description            USB HDD

Приложение микропрограммы (101fffff)
-------------------------------
идентификатор          {fce77d1c-542f-11ef-a47d-806e6f6e6963}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\UBUNTU\SHIMX64.EFI
description            Kubuntu



Цитата:

Цитата NickM
какую-нибудь уникальную комбинацию »

Вот подумал, если можно, то сделать, что было два совпадения по device и description и если совпадают, тогда вставить ИД.
Не катит, там где нужно, вообще отсутствует device. если убрать букву диска.

NickM 24-10-2024 16:30 3031997

Цитата:

Цитата NickM
Имея на руках весь вывод, эту ситуацию можно было бы обыграть в едином сценарии. »

Вот, на примере Вашего вывода - сравниваемые переменные передаются в сценарий в виде параметров:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion
For /F "Tokens=1* Delims= " %%a In ('type "%~dp0bcdedit.out"') Do (
if %%a EQU идентификатор set "ID=%%b"
if %%a EQU device set "DEV=%%b"
if %%a EQU path set "PATH=%%b"
if %%a EQU description (
set "DESCR=%%b"
if "!DEV!":"!DESCR!" EQU %1:%2 (
echo."Start OS from device %1 and decription %2"
echo."bcdedit /set {fwbootmgr} bootsequence !ID!"
)
set "ID="
set "DEV="
set "PATH="
set "DESCR="
)
)

Скрытый текст

NickM 24-10-2024 17:26 3032000

Понятно, что изначально хотелось выбирать идентификатор по описанию, но, какой смысл в этой всей чехарде, когда проще прописать идентификаторы напрямую и менять конфигурацию?

Mancoffee 24-10-2024 23:50 3032008

Цитата:

Цитата NickM
Вот, на примере Вашего вывода - сравниваемые переменные передаются в сценарий в виде параметров: »

Не, всё равно echo ничего не выводит.
Ладно, хрен с ним.
Спасибо, что старались помочь.

ПС. Спойлер не открывается. Ничего не показывает.

Цитата:

Цитата NickM
когда проще прописать идентификаторы напрямую и менять конфигурацию? »

Это понятно, но хотелось бы так сказать идеальный вариант, при котором, если ИД поменяется, то не нужно скрипт переписывать.

NickM 25-10-2024 06:33 3032011

Цитата:

Цитата Mancoffee
ПС. Спойлер не открывается. Ничего не показывает. »

Странно, под спойлером скрин, как работает сценарий;

Цитата:

Цитата Mancoffee
Не, всё равно echo ничего не выводит. »

Последний сценарий Вам потребуется переделывать под Себя, т.к. он обрабатывает текстовый файл, а не вывод bcdedit.

Но, в любом случае, его нужно/ нужно будет чуть-чуть переделать и обрабатывать параметры в другом порядке, сначала decription, после device, и сделать второй параметр не обязательным.

NickM 25-10-2024 07:37 3032012

Цитата:

Цитата NickM
о, в любом случае, его нужно/ нужно будет чуть-чуть переделать и обрабатывать параметры в другом порядке, сначала decription, после device, и сделать второй параметр не обязательным. »

Типа такого, не претендую на последнюю истину - сценарию передаём два параметра "description" и "device", первый обязательный, второй, если требуется уточнение для записи:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion
set "p1=%1"
set "p2=%2"
For /F "Tokens=1* Delims= " %%a In ('type "%~dp0bcdedit.out"') Do (
if %%a EQU идентификатор set "ID=%%b"
if %%a EQU device set "DEV=%%b"
if %%a EQU path set "PATH=%%b"
if %%a EQU description (
set "DESCR=%%b"
if not defined p2 call :onepar %p1% else
  if "!DESCR!":"!DEV!" EQU %1:%2 (
  echo."Изменяем загрузочную запись с описанием %p1% и устройством %p2%"
  echo."bcdedit /set {fwbootmgr} bootsequence !ID!"
)
set "ID="
set "DEV="
set "PATH="
set "DESCR="
)
)
goto :EOF

:onepar
if "!DESCR!" EQU %1 (
echo."Изменяем загрузочную запись с описанием %1"
echo."bcdedit /set {fwbootmgr} bootsequence !ID!"
)

Скрытый текст

Mancoffee 25-10-2024 09:06 3032016

Цитата:

Цитата NickM
Странно, под спойлером скрин, как работает сценарий; »

В письме уведомления ссылка без спойлера на imgur, перешёл, там серверная ошибка 429 - слишком много запросов. Поэтому и пустой спойлер.
Цитата:

Цитата NickM
Типа такого »

Пишет "Не удаётся найти указанный файл". Посмотрел в код, скопировал весь вывод из bat и вставил в созданный файл bcdedit.out, прописал значения в set dev и descr, выполняю, пусто, ничего не выдаёт.

ПС. Про кодировку помню.

NickM 25-10-2024 10:52 3032023

Цитата:

Цитата Mancoffee
осмотрел в код, скопировал весь вывод из bat и вставил в созданный файл bcdedit.out, прописал значения в set dev и descr, выполняю, пусто, ничего не выдаёт. »

Похоже, что Вы не понимаете, что делать.

Вот, сценарий обрабатывающий вывод команды:
Код:

bcdedit /enum
Код:

@echo off
setlocal enableextensions enabledelayedexpansion
set "p1=%1"
set "p2=%2"
For /F "Tokens=1* Delims= " %%a In ('bcdedit /enum') Do (
if %%a EQU идентификатор set "ID=%%b"
if %%a EQU device set "DEV=%%b"
if %%a EQU path set "PATH=%%b"
if %%a EQU description (
set "DESCR=%%b"
if not defined p2 call :onepar %p1% else
  if "!DESCR!":"!DEV!" EQU %1:%2 (
  echo."Изменяем загрузочную запись с описанием %p1% и устройством %p2%"
  echo."bcdedit /set {fwbootmgr} bootsequence !ID!"
)
set "ID="
set "DEV="
set "PATH="
set "DESCR="
)
)
goto :EOF

:onepar
if "!DESCR!" EQU %1 (
echo."Изменяем загрузочную запись с описанием %1"
echo."bcdedit /set {fwbootmgr} bootsequence !ID!"
)

Поясняющий скрин прилагается:
Скрытый текст

Mancoffee 25-10-2024 11:30 3032025

Цитата:

Цитата NickM
Поясняющий скрин прилагается: »

Странно, но не хочет работать.


С кавычками заработало. То бишь кавычки я так понимаю в любом случае нужны, даже если нет пробелов/спец. символов.
Но заработало тоже не до конца.
Код:

"Изменяем загрузочную запись с описанием "Arch""
"bcdedit /set {fwbootmgr} bootsequence "


NickM 25-10-2024 11:47 3032028

Цитата:

Цитата Mancoffee
То бишь кавычки я так понимаю в любом случае нужны, даже если нет пробелов/спец. символов. »

Да, оба параметра обрамляются кавычками, т.к. происходит сравнение строк в кавычках.

Всё, должно работать.

На вашем скрине запечатлён сценарий из предшествующего ответа:
Цитата:

Цитата NickM
Последний сценарий Вам потребуется переделывать под Себя, т.к. он обрабатывает текстовый файл, а не вывод bcdedit. »

А, тестировать нужно этот:
Цитата:

Цитата NickM
Вот, сценарий обрабатывающий вывод команды: »


Mancoffee 25-10-2024 12:09 3032031

Цитата:

Цитата NickM
А, тестировать нужно этот: »

Да, вот так работает
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion
set "p1=%1"
set "p2=%2"
For /F "Tokens=1,2* Delims= " %%a In ('bcdedit /enum firmware') Do (
if %%a EQU идентификатор set "ID=%%b"
if %%a EQU device set "DEV=%%b"
if %%a EQU path set "PATH=%%b"
if %%a EQU description (
set "DESCR=%%b"
if not defined p2 call :onepar %p1% else
  if "!DESCR!":"!DEV!" EQU %1:%2 (
  echo."Изменяем загрузочную запись с описанием %p1% и устройством %p2%"
  echo."bcdedit /set {fwbootmgr} bootsequence !ID!"
)
set "ID="
set "DEV="
set "PATH="
set "DESCR="
)
)
goto :EOF

:onepar
if "!DESCR!" EQU %1 (
echo."Изменяем загрузочную запись с описанием %1"
echo."bcdedit /set {fwbootmgr} bootsequence !ID!"
)


А в так сказать параметрах к bat файлу операторы сравнения работать будут, точнее должны?
Например для поиска того же UEFI OS, если искать по второму параметру, то может быть как указана буква к диску, так и volume.

NickM 25-10-2024 12:31 3032033

Цитата:

Цитата Mancoffee
Например для поиска того же UEFI OS, если искать по второму параметру, то может быть как указана буква к диску, так и volume. »

Строки сравниваются полностью, а не часть строк, поэтому и передавать следует полную строку в обоих параметрах.

Mancoffee 25-10-2024 12:43 3032034

Цитата:

Цитата NickM
Строки сравниваются полностью »

Наверное неправильно поняли, например один и тот же раздел может быть так "partition=\Device\HarddiskVolume7", а если подключена буква диска, то вот так "partition=H:"
И например указать для поиска как-то так (не знаю как в с bat файлом это делается, но например в AutoIt оператор OR)
Код:

"E:\Programs\Boot\Reboot\Reboot to Arch.bat" "Arch" "partition=\Device\HarddiskVolume7" "Arch" "partition=\Device\HarddiskVolume7" OR "partition=H:"

NickM 25-10-2024 12:45 3032035

Цитата:

Цитата Mancoffee
И например указать для поиска как-то так »

Ну, можно и третий параметр в сценарии обрабатывать. Давайте попробуем что-нибудь придумать.

NickM 25-10-2024 14:16 3032037

Цитата:

Цитата Mancoffee
И например указать для поиска как-то так »

Цитата:

Цитата Mancoffee
Код:

"Arch" "partition=\Device\HarddiskVolume7" OR "partition=H:"
»

Только сейчас понял эту строку.

Конкретно этого примера - так если отсутствует разница, какое устройство использовать, то опускайте второй параметр, параметр device и меняйте только первому, по параметру description.

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

Mancoffee 25-10-2024 14:25 3032038

Цитата:

Цитата NickM
Давайте попробуем что-нибудь придумать. »

Ну мне думать нечем, в смысле знаний по bat в сложных вещах нет, они близятся к нулю :)

Кстати, я так понял, что если есть два одинаковых description, то поиск по второму параметру не катит.
Вот выполняю
Код:

"E:\Programs\Boot\Reboot\Reboot to Arch.bat" "UEFI OS" "partition=\Device\HarddiskVolume18"
И пустота, хотя в выводе он есть
Код:

Приложение микропрограммы (101fffff)
-------------------------------
идентификатор          {58ec2b43-90b8-11ef-a537-806e6f6e6963}
device                  partition=\Device\HarddiskVolume18
path                    \EFI\BOOT\BOOTX64.EFI
description            UEFI OS

Цитата:

Цитата NickM
Ведь Вы же всяко стремитесь к тому, что бы задавать записям загрузчика description уникальными. »

Ну это да, но как мы с вами выяснили, это либо невозможно (будет сбрасываться на оригинал), либо как-то сложно.

NickM 25-10-2024 14:48 3032039

Цитата:

Цитата Mancoffee
Кстати, я так понял, что если есть два одинаковых description, то поиск по второму параметру не катит.
Вот выполняю »

Всё катит, на примере Вашего вывода:
Скрытый текст

Mancoffee 25-10-2024 15:21 3032040

Цитата:

Цитата NickM
Всё катит, на примере Вашего вывода: »

Тогда я не понимаю, как это работает
https://youtu.be/BiPeL-1Iv9g

NickM 25-10-2024 16:23 3032043

Цитата:

Цитата Mancoffee
Тогда я не понимаю, как это работает »

Как работает показано выше, на скрине.

Покажите результат выполнения только по description, только по первому параметру "UEFI OS".

Mancoffee 25-10-2024 17:18 3032046

Цитата:

Цитата NickM
Покажите результат выполнения только по description, только по первому параметру "UEFI OS". »

https://youtu.be/b9nW3vrRNG8

NickM 25-10-2024 19:04 3032049

Ну, теперь всё ясно-понятно. Вы используете не тот сценарий, вроде как два раза указывал, какой использовать, этот.

Mancoffee 25-10-2024 19:13 3032050

Цитата:

Цитата NickM
Ну, теперь всё ясно-понятно »

Всё равно непонятно :)
https://youtu.be/tpwMIgpnT2M

ПС. Так даже вообще уже ничего не находит. Тот же Arch уже не видит.

NickM 25-10-2024 19:21 3032051

Цитата:

Цитата Mancoffee
ПС. Так даже вообще уже ничего не находит. Тот же Arch уже не видит. »

Возможно, что Вы просто не сохранили файл сценария, а весь остальной код у вас закомментирован.

Работа сценария Мною проверяется, прежде чем код публикуется на форуме.

Mancoffee 25-10-2024 19:56 3032053

Цитата:

Цитата NickM
Возможно, что Вы просто не сохранили файл сценария, а весь остальной код у вас закомментирован. »

Не, всё норм, это автосохранение при потере фокуса, если посмотрите, то жёлтая полосочка на вкладке - это не сохранено, когда щёлкнул по панели задач, то он исчезла - это автосохранение.
Цитата:

Цитата NickM
Работа сценария Мною проверяется, прежде чем код публикуется на форуме. »

Я ж ничего не говорю, я к тому, что "магия" какая-то. Даже не знаю, что может быть не так.

Кстати и оно логично, что не находит, потому что команда bcdedit /enum выводит только данные о текущей ОС, а с firmware все записи. добавил соответствующий параметр и уже находит и Arch, и ubuntu и т.д., и даже UEFI OS нашло по одному только description.

NickM 25-10-2024 20:05 3032054

Цитата:

Цитата Mancoffee
Кстати и оно логично, что не находит, потому что команда bcdedit /enum выводит только данные о текущей ОС, а с firmware все записи. »

Понятно.
Не придавал этому значения, т.к. располагаю наипростейшими загрузочными записями;

Цитата:

Цитата Mancoffee
и даже UEFI OS нашло по одному только description. »

Ну, теперь выполняйте с параметрами из этого видео.

Mancoffee 25-10-2024 20:42 3032056

Цитата:

Цитата NickM (Сообщение 3032054)
Ну, теперь выполняйте с параметрами из этого видео.

Ну проверил парочку, вроде чётко всё, за что большое спасибо :)

NickM 25-10-2024 20:52 3032057

Цитата:

Цитата Mancoffee
Ну проверил парочку, вроде чётко всё »

Вот и разобрались, на 6-ой странице темы :search:

DJ Mogarych 26-10-2024 06:38 3032070

Чисто для коллекции вариант на Powershell

Код:

$bcdedit = (gc C:\temp\bcdedit.txt -raw -Encoding oem) `
-replace '^Приложение[\s\S]*?-{3,}|Приложение.*' -split '-{3,}' -replace '\s{5,}(?=\S)','=' -replace '\\','\\' |% {
    New-Object PSOBject -Property (ConvertFrom-StringData $_) |select идентификатор,device,path,description
}

$bcdedit

идентификатор                          device                            path                    description
-------------                          ------                            ----                    -----------
{08466ee1-90f9-11ef-a538-806e6f6e6963} partition=\Device\HarddiskVolume13 \EFI\UBUNTU\SHIMX64.EFI ubuntu
{58ec2b43-90b8-11ef-a537-806e6f6e6963} partition=H:                      \EFI\BOOT\BOOTX64.EFI  UEFI OS
{58ec2b44-90b8-11ef-a537-806e6f6e6963} partition=I:                      \EFI\BOOT\BOOTX64.EFI  UEFI OS

Код:

($bcdedit |? description -eq ubuntu).идентификатор
{08466ee1-90f9-11ef-a538-806e6f6e6963}


SQLai Lama 27-10-2024 10:58 3032099

Код:

((sls 'description\s+ubuntu' C:\temp\bcdedit.txt -co 3,0).Context.PreContext | sls '{[0-9a-f-]+}').Matches.Value

Mancoffee 12-01-2025 12:45 3034969

Цитата:

Цитата SQLai Lama
од:
((sls 'description\s+ubuntu' C:\temp\bcdedit.txt -co 3,0).Context.PreContext | sls '{[0-9a-f-]+}').Matches.Value »

Это что куда?

Цитата:

Цитата DJ Mogarych
Чисто для коллекции вариант на Powershell »

Не понял, как это работает, выполнил код, выполняю переменную, пусто.


Время: 07:07.

Время: 07:07.
© OSzone.net 2001-