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

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

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

Аватара для m0nkrus

Старожил


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

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


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

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

 

Аватара для m0nkrus

Старожил


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

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


Ксеноинженер, вы пробовали проверять свою конструкцию в деле? У меня совмещение двух строк без промежуточного помещения результатов в файл disks.txt:
Код: Выделить весь код
ECHO LIST DISK | DISKPART | FINDSTR /r /c:"\*$" > disks.txt
FOR /f "tokens=2" %%i IN (disks.txt) DO ECHO select disk %%i >> diskpart.txt && ECHO detail disk >> diskpart.txt
...в аналог вашего кода:
Код: Выделить весь код
for /f "tokens=2" %%I IN ('Echo List Disk ^| Diskpart ^| Findstr /e "Boot Загрузоч"') do echo Select Disk ^%%I > diskpart.txt && echo uniqueid disk >> diskpart.txt
...не проходило - ругается то на команду echo, то на знак |. При помощи ^ вы экранировали символы |, но остаются ли последние после этого работоспособными? Кстати, при применениии конструкции "echo Select Disk ^%%I > diskpart.txt" вы получите перезапись старых значений новыми, а не накопление оных. Это не говоря уже о том, что искать подстроки "Boot Загрузоч" в результатах срабатывания команды List Disk бесполезно - их там нет.

Поиск "{" через команду uniqueid disk действительно может помочь в определении GPT-раздела. Только тут надо каждый раздел подключать и проверять поочередно, а я с помощью команды List Disk нахожу их все одним махом. Да и ничуть uniqueid disk не поможет в определении, есть ли среди GPT-дисков загрузочный, для чего я и использую detail disk.

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

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


Отправлено: 23:47, 26-04-2013 | #21



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

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


Пользователь


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

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


m0nkrus, Вы были корректны. Моё недоразумение в данном случае.
Возвращаюсь к Вашему, правильному, скрипту.
Обойтись одним внешним файлом всё же можно (проверил, работает на GPT и MBR)
каретки "^" обеспечивают целостность строки echo, не разрывая цикл символами "|".
Код: Выделить весь код
CD /d %~dp0
for /f "tokens=2" %%I IN ('echo List Disk ^| Diskpart ^| Findstr /r /c:"\*$"') do echo Select Disk %%I >> diskpart.txt && echo detail disk >> diskpart.txt
Diskpart /s diskpart.txt | findstr /e "Boot Загрузоч"
IF ERRORLEVEL 1 (
	ECHO Загрузочный том размещен на MBR-разделе
	) ELSE (
	ECHO Загрузочный том размещен на GPT-разделе
	)
)
del /q diskpart.txt
pause
Цитата:
остаются ли последние после этого работоспособными?
да, остаются, это как с двойным %% для переменной работает
Цитата:
перезапись старых значений новыми
Не подумал о нескольких gpt дисках в системе, был не прав
Цитата:
он в таком виде не заработает совершенно точно.
Что ж, с этим я смирюсь как-нибудь. Важно другое, мастер лучших в рунете сборок Windows Vista/7/8 - это Вы, уважаемый m0nkrus. Дело мастера боится.
Одно пока мне неясно, как скрыть сообщение о найденном GPT диске. @echo off почему-то не сработал?
Это сообщение посчитали полезным следующие участники:

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


Ветеран


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

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


Нагляднее (не проверялось):
Код: Выделить весь код
for /f "tokens=2" %%I IN ('echo List Disk ^| Diskpart ^| Findstr /r /c:"\*$"') do (
    > diskpart.txt (echo Select Disk %%I
    echo detail disk)
)
Также можно использовать такую методику работы с diskpart.exe:
Код: Выделить весь код
(echo select disk 0 & echo list volume) | diskpart.exe
т.е. (также не проверялось) наподобие:
Код: Выделить весь код
for /f "tokens=2" %%I IN ('echo List Disk ^| Diskpart ^| Findstr /r /c:"\*$"') do (
	(echo Select Disk %%I
	echo detail disk) | diskpart.exe | findstr.exe /e "Boot Загрузоч"
	IF ERRORLEVEL 1 (
		ECHO Загрузочный том размещен на MBR-разделе
	) ELSE (
		ECHO Загрузочный том размещен на GPT-разделе
	)
)
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:33, 27-04-2013 | #23


Аватара для m0nkrus

Старожил


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

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


Цитата Ксеноинженер:
да, остаются, это как с двойным %% для переменной работает »
Это действительно полезная оптимизация.
Цитата Ксеноинженер:
Одно пока мне неясно, как скрыть сообщение о найденном GPT диске. @echo off почему-то не сработал? »
Это-то как раз просто. В конце команды добавить "> nul". Но в моем конкретном случае это несущественно.

Iska
Спасибо, посмотрю ваши наработки. Потестирую. Оптимально, конечно, совсем отказаться от внешних файлов.

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


Аватара для m0nkrus

Старожил


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

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


Iska, первая конструкция рабочая, за исключением маленького нюанса. Она у вас тоже предусматривает наличие только одного GPT раздела. Надо так:
Код: Выделить весь код
for /f "tokens=2" %%I IN ('echo List Disk ^| Diskpart ^| Findstr /r /c:"\*$"') do (
    >> diskpart.txt (echo Select Disk %%I
    echo detail disk)
)
Вторая конструкция тоже рабочая. Команды вы правда подобрали бессистемно. Команде, начинающейся с list без разницы, какой диск выбран. Но сама идея конструкта интересна.

Третий код снова не учитывает наличия нескольких GPT-разделов. Если их два и система размещена на первом, то на выходе скрипта мы получим, что система у нас, якобы на MBR.

Отправлено: 10:33, 27-04-2013 | #25


Ветеран


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

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


Цитата m0nkrus:
Она у вас тоже предусматривает наличие только одного GPT раздела. »
m0nkrus, у меня и одного-то нет . Я потому и писал — «не проверялось». Я просто брал код из чужого поста и на его основе «лопатил». «Отлопаченное» выделял цветом.

Цитата m0nkrus:
Команды вы правда подобрали бессистемно. Команде, начинающейся с list без разницы, какой диск выбран. »
Второй пример — просто иллюстрация возможности передачи двух (и более) строк по конвейеру на вход «diskpart.exe».

Ежели сделаете на «отлопаченном» проверенный рабочий вариант — поместите его в тему.

Отправлено: 10:44, 27-04-2013 | #26


Аватара для m0nkrus

Старожил


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

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


Цитата Iska:
m0nkrus, у меня и одного-то нет . Я потому и писал — «не проверялось» »
Дык, у меня тоже нет. Для проверки я просто меняю код "\*$" на "\ $" и в качестве подопытных выступают MBR-разделы.
Цитата Iska:
Ежели сделаете на «отлопаченном» проверенный рабочий вариант — поместите его в тему. »
Пока, на мой взгляд, оптимальный рабочий вариант, это тот, что на основе моего сделал Ксеноинженер.

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


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


Аватара для m0nkrus

Старожил


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

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


Iska, хотя можно тоже кое-что и из ваших наработок позаимствовать, немного оптимизировав:
Код: Выделить весь код
@ECHO OFF
CD /d %~dp0
FOR /f "tokens=2" %%i IN ('ECHO LIST DISK ^| DISKPART ^| FINDSTR /r /c:"\*$"') DO (>> diskpart.txt (ECHO select disk %%i && ECHO detail disk))
DISKPART /s "diskpart.txt" | FINDSTR /e "Boot Загрузоч" > nul
IF ERRORLEVEL 1 (
    ECHO Загрузочный том размещен на MBR-разделе
) ELSE (
    ECHO Загрузочный том размещен на GPT-разделе
)
PAUSE
Только не знаю, можно ли считать замену конструкции:
Код: Выделить весь код
ECHO select disk %%i >> diskpart.txt && ECHO detail disk >> diskpart.txt
... на эту:
Код: Выделить весь код
(>> diskpart.txt (ECHO select disk %%i && ECHO detail disk))
...оптимизацией. Если бы команд на каждом витке цикла было больше, то да, это бы подсократило код, но всего с двумя элементами особой разницы нет.

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


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


Ветеран


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

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


Цитата m0nkrus:
можно ли считать »
m0nkrus, если рассуждать теоретически,
читать дальше »
при большом количестве «echo» — можно: насколько я понимаю (замерял, но не проверял, например, в отладчике), при группировке вывода:
Код: Выделить весь код
> Out.txt ( echo …
echo …
…
echo …)
открытие/закрытие файла происходит один раз в отличие от типичного:
Код: Выделить весь код
echo …> Out.txt
echo …>> Out.txt
…
echo …>> Out.txt
Иллюстрация…

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

echo %time%

>"%~n0.txt" (
	for /l %%i in (1, 1, 10000) do (
		echo %%i
	)
)

echo %time%

endlocal
exit /b 0
0002.cmd
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

echo %time%

for /l %%i in (1, 1, 10000) do (
	>>"%~n0.txt" echo %%i
)

echo %time%

endlocal
exit /b 0
Результат:
Код: Выделить весь код
E:\Песочница\0244>0001.cmd
14:10:02.20
14:10:02.56

E:\Песочница\0244>0002.cmd
14:10:05.06
14:10:14.06

Последний раз редактировалось Iska, 27-04-2013 в 14:13. Причина: Добавил иллюстрацию


Отправлено: 13:46, 27-04-2013 | #29


Аватара для m0nkrus

Старожил


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

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


Iska, согласен. Но, как я уже говорил, это становится сколько-нибудь критичным при много большем количестве вносимых строк.

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



Компьютерный форум 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




 
Переход