Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Узнать, MBR или GPT?

Ответить
Настройки темы
CMD/BAT - [решено] Узнать, MBR или GPT?

Аватара для m0nkrus

Старожил


Сообщения: 148
Благодарности: 15

Профиль | Сайт | Отправить PM | Цитировать


Нужно получить данные, какой формат имеет диск С, MBR или GPT и исходя из этой инфы задать флаговую переменную как 0 или 1.

Отправлено: 19:10, 24-04-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

cd /d %~dp0

<nul set /p sVar=Загрузочный том размещен на 

for /f "tokens=2" %%i in (
	'echo list disk ^| diskpart.exe ^| findstr.exe /r /c:"\*$"'
) do set sDisk=%%i

if defined sDisk (
	(
		echo select disk !sDisk!
		echo detail disk
	) | diskpart.exe | findstr.exe /e "Boot Загрузоч" >nul && echo GPT-разделе || echo MBR-разделе
) else echo MBR-разделе

endlocal
exit /b 0
Как это будет работать при множественных GPT?

Всё равно мне не нравится такой путь.

Отправлено: 14:27, 27-04-2013 | #31



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для m0nkrus

Старожил


Сообщения: 148
Благодарности: 15

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
Как это будет работать при множественных GPT? »
Хреново будет работать. Переменная sDisk по окончании цикла будет иметь инфу только о последнем GPT-диске из всего списка найденных. Тут массив нужен, а не переменная. Мы его и создаем во внешнем файле. Можно попытаться как-то воспользоваться идеей массива из этого топика: http://forum.oszone.net/post-1886306.html Там, кстати, и ваша благодарность прописана - вы его читали! Или, вот, альтернативная идея написания массива со стороннего сайта:
Код: Выделить весь код
@echo off
setlocal enabledelayedexpansion

:: инициализировать 10 переменных вида arr.X случайными числами
for /l %%i in ( 0, 1, 9 ) do (
    set /a arr.%%i=!RANDOM!
)
set arr

endlocal
Я вам уже говорил, временно замените "\*$" на "\ $" и прогоните таким образом скрипт на своих MBR-разделах. Скрипт станет принимать MBR за GPT и наоборот. Если на компе больше одного физического диска, и система стоит не на последнем, то это будет весьма наглядно.

Последний раз редактировалось m0nkrus, 27-04-2013 в 19:45.


Отправлено: 18:15, 27-04-2013 | #32


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата m0nkrus:
Я вам уже говорил, временно замените "\*$" на "\ $" и прогоните таким образом скрипт на своих MBR-разделах. Скрипт станет принимать MBR за GPT и наоборот. Если на компе больше одного физического диска, и система стоит не на последнем, то это будет весьма наглядно. »
В том-то и дело:

1. Заменил «\*$» на «\ $».
2. Четыре физических диска, два из них в RAID. Логических, соответственно, три. Везде MBR.
3. Операционная система установлена на первом диске в его первом разделе.
4. Запустил код.

Получил следующее:
Цитата:
Загрузочный том размещен на MBR-разделе
А у Вас что получается при такой замене и на таком коде?

m0nkrus, я выше писал, что данный подход мне не нравится. Моя идея (реализацию которой я приводил выше на WSH и PoSH) — «танцевать вперёд», а не «пятится назад»: определить, какой раздел системный, получить его букву, по разделу получить содержащий его диск, и только потом смотреть, каков этот диск — MBR или GPT.

Отправлено: 05:28, 28-04-2013 | #33


Аватара для m0nkrus

Старожил


Сообщения: 148
Благодарности: 15

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
А у Вас что получается при такой замене и на таком коде? »
У меня при такой замене НА МОЕМ КОДЕ получается "Загрузочный том размещен на GPT-разделе". НА ВАШЕМ - то же самое, что и у вас - MBR. Как я уже говорил, переменная sDisk передает инфу только о последнем физическом диске в списке. Большинство людей подключают диск, предназначенный под систему, к порту с наименьшим номером. Ни вы, ни я не исключение. Посему на выдаче sDisk мы получаем не системный диск, а тот, который скорее всего используется под файлопомойку. Как результат, ключ "Boot Загрузоч" на нем не находится и скрипт считает, что системный диск размещен на разделе другого формата.
Цитата Iska:
Моя идея (реализацию которой я приводил выше на WSH и PoSH) — «танцевать вперёд», а не «пятится назад»: определить, какой раздел системный, получить его букву, по разделу получить содержащий его диск, и только потом смотреть, каков этот диск — MBR или GPT. »
Объясню, почему я отдаю предпочтение CMD перед PowerShell: с языком CMD я достаточно знаком, чтобы понять, разобрать, найти ошибки и оптимизировать скрипт, в то время как с языком PowerShell я не знаком абсолютно. Вот вы (не в обиду) раз за разом наступаете на одни и те же грабли с переменной в CMD вместо массива - это я могу просечь и пресечь. А если вы мне предложите скрипт на WSH или PoSH с аналогичной или любой другой ошибкой, то я ее уже не смогу распознать! К тому же, я не знаю, корректно ли отработает ваш скрипт, запущенный из SetupComplete.cmd. Недавно, к примеру, столкнулся с тем, что скрипт, помещенный в аналогичный установочный файл oobe.cmd не воспринимает путь "%~dp0" - пришлось городить сложную конструкцию, чтобы определить путь запуска... И как вы себе представляете, что я буду вылавливать подобные проблемы без знания языка и не имея GPT-раздела под рукой? В остальном, согласен, что «танцевать вперёд» - более предпочтительный метод, на реализацию которого, по логике, должно затрачиваться куда меньше ресурсов.

Последний раз редактировалось m0nkrus, 28-04-2013 в 08:01.


Отправлено: 07:45, 28-04-2013 | #34


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


m0nkrus, вот потому я и предлагаю другой путь — от буквы системного раздела к дисковому устройству (насчёт порта с наименьшим номером — немало раз видел иное: как недосборщику в голову взбредёт — так и будет; в любом случае, обоснованием корректности алгоритма сие не должно служить).

Отправлено: 10:39, 28-04-2013 | #35


Аватара для m0nkrus

Старожил


Сообщения: 148
Благодарности: 15

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
вот потому я и предлагаю другой путь — от буквы системного раздела к дисковому устройству »
Без проблем. Предложите его в CMD-формате и я с удовольствием им воспользуюсь. Если вы не заметили, то топик имеет пометку "CMD/BAT", а отнюдь не "PowerShell" или "Любой язык".
Цитата Iska:
насчёт порта с наименьшим номером — немало раз видел иное: как недосборщику в голову взбредёт — так и будет; в любом случае, обоснованием корректности алгоритма сие не должно служить »
А кто обосновывает этим корректность алгоритма? Мой алгоритм работает без привязки к тому, каким по счету идет системный GPT-раздел. А вот предложенный вами алгоритм может сработать только либо в случае наличия всего одного GPT-раздела, либо если система при наличии нескольких таких разделов, находится на последнем в очереди GPT-диске.

Вас уже куда-то не туда заносит, вам не кажется? Уже какие-то наезды непонятные пошли. Если вы не в состоянии понять, почему вариант с массивом работает, а с переменной нет, или почему я не хочу использовать PowerShell-скрипт при наличии альтернативы в виде CMD-скрипта, то это не повод на меня наскакивать.

Последний раз редактировалось m0nkrus, 28-04-2013 в 12:30.


Отправлено: 11:21, 28-04-2013 | #36


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата m0nkrus:
Мой алгоритм»
Мы столько наплодили, что по предыдущему Вашему сообщению:
Цитата m0nkrus:
У меня при такой замене НА МОЕМ КОДЕ »
мне было не совсем ясно, о каком коде именно идёт речь. Теперь понятно.

Цитата m0nkrus:
…работает без привязки к тому, каким по счету идет системный GPT-раздел. А вот предложенный вами алгоритм может сработать только либо в случае наличия всего одного GPT-раздела, либо если система при наличии нескольких таких разделов, находится на последнем в очереди GPT-диске. »
Принимается.

Цитата m0nkrus:
Вас уже куда-то не туда заносит, вам не кажется? Уже какие-то наезды непонятные пошли. Если вы не в состоянии понять, почему вариант с массивом работает, а с переменной нет, или почему я не хочу использовать PowerShell-скрипт при наличии альтернативы в виде CMD-скрипта, то это не повод на меня наскакивать. »
Вам почудилось. Не обижайтесь и не воспринимайте сие в таком ракурсе. Подобного не было. Мне просто тоже было интересно разобраться. Разобрался (см. ниже).


Ваш код у меня не работал. И при использовании «обратки» (смена «\*$» на «\ $») — тоже (кстати, и мой, сделанный по Вашему коду, в этой части — тоже не работал). Суть оказалась в том,
читать дальше »
что «diskpart.exe», идущий в комплекте с Windows XP, делает при перенаправлении вывод строк в формате Unix — не «CtLf», а только «Lf». «findstr.exe», идущий в комплекте с той же ОС, сопоставляет что параметр «/e», что символ «$» в регулярке «/r /c:"$"» только с «CrLf», но не сопоставляет с «Lf». Посему, при использовании параметра или «$», под Windows XP «findstr.exe» находит в выводе «diskpart.exe» одну b исключительно одну подходящую строку — завершающую:
Код: Выделить весь код
DISKPART>
да и то лишь потому, что в конце её и вовсе нет никаких символов конца строки.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:01, 28-04-2013 | #37


Аватара для m0nkrus

Старожил


Сообщения: 148
Благодарности: 15

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
мне было не совсем ясно, о каком коде именно идёт речь. »
Что этот вариант, что этот, что этот с точки зрения отсутствия привязки к тому, каким по счету идет системный GPT-раздел, работают идентично.

Отправлено: 19:25, 28-04-2013 | #38


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


m0nkrus, ну, так мне до этого нужно было ещё «дойти» .

Отправлено: 21:12, 28-04-2013 | #39


Новый участник


Сообщения: 12
Благодарности: 2

Профиль | Отправить PM | Цитировать


На загрузочных GPT-дисках обязательно присутствует EFI в качестве 1-го системного раздела и MSR для 2-го. Информация об этом дается командой list partition. Поэтому принадлежность диска к GPT легко определить по типам раздела на диске.

Отправлено: 01:00, 30-04-2013 | #40



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Узнать, MBR или GPT?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
HDD - Как разбить HDD диск: MBR или GPT ? jolo Накопители (SSD, HDD, USB Flash) 22 09-12-2014 04:46
Разное - GPT в MBR без потери данных V1P3RS Microsoft Windows 7 13 02-04-2014 03:09
Разное - GPT в MBR и нерабочий WiFi pavel.trice@vk Microsoft Windows 7 1 20-01-2013 13:33
Установка - [решено] Установка Windows 7 на SSD с MBR-разметкой (требует GPT) AtlASS Microsoft Windows 7 14 14-11-2012 06:31
HDD - [решено] Восcтановить MBR и/или информацию.. Dick Накопители (SSD, HDD, USB Flash) 17 27-07-2012 18:33




 
Переход