Войти

Показать полную графическую версию : [решено] Как найти строку в блоке вывода bat, но вставить другую?


Страниц : 1 [2] 3

Mancoffee
24-10-2024, 14:48
кодировке cp866 »
Ну это помню, всё нормально.
https://s01.pic4net.com/dt-6GDHTF.jpeg (https://s01.pic4net.com/di-6GDHTF.jpeg)

NickM
24-10-2024, 14:57
Ну да, в принципе по device самый лучший вариант. »
Так, на ваших скринах же отчётливо видно, что этот самый device не уникальный, тогда, зачем за него цепляться?
Как вариант, найти тот параметр, который будет отличаться в этих записях.
Т.е. опираться не на description , а на что-то другое и/ или комбинацию параметров; »

Mancoffee
24-10-2024, 14:59
Так, на ваших скринах же отчётливо видно, что этот самый device не уникальный, тогда, зачем за него цепляться? »
В смысле? Вот же уникальность - HarddiskVolume13
Ааа всё, я не обращал даже внимания, как так, одинаковые вольюмы ...

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

NickM
24-10-2024, 15:05
Так тогда не за что и цепляться, чтоб наверняка. »
Подумайте.

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

Mancoffee
24-10-2024, 15:07
Или покажите полный вывод записей bcdedit, возможно, что что-нибудь и можно будет придумать. какую-нибудь уникальную комбинацию. »
Так тут нет над чем думать, всего-то четыре строки. На скринах и отдельным кодом, что до этого писал, это всё, что выдаёт.

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

sov44
24-10-2024, 15:16
Если проблема с запуском нужной ОС, наверное нужно добавить в код приоритет загрузки, типа
bcdedit bootsequence {08466ee1-90f9-11ef-a538-806e6f6e6963} /addfirst

Mancoffee
24-10-2024, 15:18
Если проблема с запуском нужной ОС, наверное нужно добавить в код приоритет загрузки, типа »
Так дело не с приоритетом, а поиском в выводе.

NickM
24-10-2024, 15:24
Так тут нет над чем думать, всего-то четыре строки. На скринах и отдельным кодом, что до этого писал, это всё, что выдаёт. »
Когда не располагаешь всей информацией, то приходиться догадываться.

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

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

Mancoffee
24-10-2024, 15:27
Имея на руках весь вывод, эту ситуацию можно было бы обыграть в едином сценарии. »
А, вы имеете ввиду полный список записей наверное ...

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



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

NickM
24-10-2024, 16:30
Имея на руках весь вывод, эту ситуацию можно было бы обыграть в едином сценарии. »
Вот, на примере Вашего вывода - сравниваемые переменные передаются в сценарий в виде параметров:
@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="
)
)

https://i.imgur.com/53DcNVG.png

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

Mancoffee
24-10-2024, 23:50
Вот, на примере Вашего вывода - сравниваемые переменные передаются в сценарий в виде параметров: »
Не, всё равно echo ничего не выводит.
Ладно, хрен с ним.
Спасибо, что старались помочь.

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

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

NickM
25-10-2024, 06:33
ПС. Спойлер не открывается. Ничего не показывает. »
Странно, под спойлером скрин, как работает сценарий;

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

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

NickM
25-10-2024, 07:37
о, в любом случае, его нужно/ нужно будет чуть-чуть переделать и обрабатывать параметры в другом порядке, сначала 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!"
)


https://i.imgur.com/ApH5zlS.png

Mancoffee
25-10-2024, 09:06
Странно, под спойлером скрин, как работает сценарий; »
В письме уведомления ссылка без спойлера на imgur, перешёл, там серверная ошибка 429 - слишком много запросов. Поэтому и пустой спойлер.
Типа такого »
Пишет "Не удаётся найти указанный файл". Посмотрел в код, скопировал весь вывод из bat и вставил в созданный файл bcdedit.out, прописал значения в set dev и descr, выполняю, пусто, ничего не выдаёт.

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

NickM
25-10-2024, 10:52
осмотрел в код, скопировал весь вывод из 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!"
)

Поясняющий скрин прилагается:
https://i.ibb.co/GVm4V5P/Image-010.png

Mancoffee
25-10-2024, 11:30
Поясняющий скрин прилагается: »
Странно, но не хочет работать.
https://s01.pic4net.com/dt-Z5A1Z3.jpeg (https://s01.pic4net.com/di-Z5A1Z3.jpeg)

С кавычками заработало. То бишь кавычки я так понимаю в любом случае нужны, даже если нет пробелов/спец. символов.
Но заработало тоже не до конца.
"Изменяем загрузочную запись с описанием "Arch""
"bcdedit /set {fwbootmgr} bootsequence "

NickM
25-10-2024, 11:47
То бишь кавычки я так понимаю в любом случае нужны, даже если нет пробелов/спец. символов. »
Да, оба параметра обрамляются кавычками, т.к. происходит сравнение строк в кавычках.

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

На вашем скрине запечатлён сценарий из предшествующего ответа:
Последний сценарий Вам потребуется переделывать под Себя, т.к. он обрабатывает текстовый файл, а не вывод bcdedit. »

А, тестировать нужно этот:
Вот, сценарий обрабатывающий вывод команды: »

Mancoffee
25-10-2024, 12:09
А, тестировать нужно этот: »
Да, вот так работает
@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
Например для поиска того же UEFI OS, если искать по второму параметру, то может быть как указана буква к диску, так и volume. »
Строки сравниваются полностью, а не часть строк, поэтому и передавать следует полную строку в обоих параметрах.




© OSzone.net 2001-2012