Узнать, MBR или GPT?
Нужно получить данные, какой формат имеет диск С, MBR или GPT и исходя из этой инфы задать флаговую переменную как 0 или 1.
|
Код:
@Echo Off |
zion87, ну вы бы хоть посмотрели, как команда List Disk в Diskpart отображает наличие GPT... Там столбец GPT, он всегда есть. Соответственно результат работы вашего скрипта будет всегда одинаков. А если раздел GPT, то это обозначается наличием звездочки в соответствующем столбце.
Вот так это выглядит: Но бывает и такой вариант, так что ориентироваться ТОЛЬКО НА НАЛИЧИЕ ЗВЕЗДОЧКИ нельзя: |
m0nkrus, используйте такой подход:
Detect GPT and MBR partitions with Powershell - Stack Overflow GPT oder MBR: Partitionierungsschema auslesen mit diskpart, wmic, PowerShell | WindowsPro P.S. У меня нет GPT под рукой, проверять и отлаживать пакетный файл не на чем. |
Цитата:
За ссылки спасибо - гляну. |
Посмотрите. Если делаете на сторону — может проще будет использовать как раз WSH, або PoSH.
|
Iska, мне нужно эту выборку задействовать в SetupComplete.cmd автоустановки семерки. Так что CMD и только CMD.
P.S. Боюсь для решения моей проблемы по приведенным выше ссылкам инфы не наблюдается... |
Прикинул, покумекал... По логике, так как при выводе через DISKPART столбец GPT последний, а под элементы, даже если они отсутствуют, место резервируется, то таким образом видоизмененный вариант скрипта zion87 должен работать:
Код:
@Echo Off |
На WSH:
Код:
Option Explicit |
Iska, ну я же сказал, что на WSH мне не пойдет...
|
Цитата:
Если серьёзно — я не видел последующей правки: Цитата:
|
powershell.exe можно вызвать из SetupComplete
|
Цитата:
|
Цитата:
Код:
$sComputerName = "." Код:
@echo off |
Iska, спасибо, потестирую.
|
Iska, так, что-то я уперся...
Я так понимаю, в прошлом вашем посте первое - это скрипт для PowerShell, который должен быть помещен в файл БезИмени1.ps1, так? Второе - cmd-файл, который и обращается к скрипту PowerShell и получает от него результат, так? Так вот, не работает. Если оставить расширение ps1, то cmd-шник просто открывает ps1 блокнотом. А если расширение заменить на пауэршелловское psc1, то cmd просто вылетает на этой команде. Тот же эффект при замене строки .\БезИмени1.ps1 на PowerShell -PSConsoleFile БезИмени1.psс1 Что я делаю не так? У меня, между тем, разработка скрипта на основе diskpart вышла на финишную прямую. Вот до чего я дошел: Код:
CD /d %~dp0 |
Цитата:
Цитата:
Стоп. У Вас логика с errorlevel — мне не понятная. Словами опишите. |
Iska, с PowerShell посмотрю позже.
Логика с errorlevel простая: если в файле найдена ключевая строка, информирующая, что на ней размещен загрузочный диск (он в системе один), то ошибки нет и это GPT, если такой строки ни на одном из GTP-дисков не обнаружено, то, и поиск не дал результата - ошибка - значит по остаточному признаку загрузочным диском считать MBR. |
m0nkrus, спасибо, теперь ясно.
Цитата:
|
m0nkrus, на тему оптимизации: логично было бы вместо detail disk использовать uniqueid disk, и если ID содержит "{" - то диск имеет GUID, и следовательно GPT.
Код:
@echo off |
Ксеноинженер, вы пробовали проверять свою конструкцию в деле? У меня совмещение двух строк без промежуточного помещения результатов в файл disks.txt:
Код:
ECHO LIST DISK | DISKPART | FINDSTR /r /c:"\*$" > disks.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 Поиск "{" через команду uniqueid disk действительно может помочь в определении GPT-раздела. Только тут надо каждый раздел подключать и проверять поочередно, а я с помощью команды List Disk нахожу их все одним махом. Да и ничуть uniqueid disk не поможет в определении, есть ли среди GPT-дисков загрузочный, для чего я и использую detail disk. Если честно, в вашем скрипте столько ошибок и логических нестыковок, что он в таком виде не заработает совершенно точно. Это я могу сказать даже без тестирования. |
m0nkrus, Вы были корректны. Моё недоразумение в данном случае.
Возвращаюсь к Вашему, правильному, скрипту. Обойтись одним внешним файлом всё же можно (проверил, работает на GPT и MBR) каретки "^" обеспечивают целостность строки echo, не разрывая цикл символами "|". Код:
CD /d %~dp0 Цитата:
Цитата:
Цитата:
Одно пока мне неясно, как скрыть сообщение о найденном GPT диске. @echo off почему-то не сработал? |
Нагляднее (не проверялось):
Код:
for /f "tokens=2" %%I IN ('echo List Disk ^| Diskpart ^| Findstr /r /c:"\*$"') do ( Код:
(echo select disk 0 & echo list volume) | diskpart.exe Код:
for /f "tokens=2" %%I IN ('echo List Disk ^| Diskpart ^| Findstr /r /c:"\*$"') do ( |
Цитата:
Цитата:
Iska Спасибо, посмотрю ваши наработки. Потестирую. Оптимально, конечно, совсем отказаться от внешних файлов. |
Iska, первая конструкция рабочая, за исключением маленького нюанса. Она у вас тоже предусматривает наличие только одного GPT раздела. Надо так:
Код:
for /f "tokens=2" %%I IN ('echo List Disk ^| Diskpart ^| Findstr /r /c:"\*$"') do ( Третий код снова не учитывает наличия нескольких GPT-разделов. Если их два и система размещена на первом, то на выходе скрипта мы получим, что система у нас, якобы на MBR. |
Цитата:
Цитата:
Ежели сделаете на «отлопаченном» проверенный рабочий вариант — поместите его в тему. |
Цитата:
Цитата:
|
Iska, хотя можно тоже кое-что и из ваших наработок позаимствовать, немного оптимизировав:
Код:
@ECHO OFF Код:
ECHO select disk %%i >> diskpart.txt && ECHO detail disk >> diskpart.txt Код:
(>> diskpart.txt (ECHO select disk %%i && ECHO detail disk)) |
Добавил иллюстрацию
Цитата:
|
Iska, согласен. Но, как я уже говорил, это становится сколько-нибудь критичным при много большем количестве вносимых строк.
|
Код:
@echo off Всё равно мне не нравится такой путь. |
Цитата:
Код:
@echo off |
Цитата:
1. Заменил «\*$» на «\ $». 2. Четыре физических диска, два из них в RAID. Логических, соответственно, три. Везде MBR. 3. Операционная система установлена на первом диске в его первом разделе. 4. Запустил код. Получил следующее: Цитата:
m0nkrus, я выше писал, что данный подход мне не нравится. Моя идея (реализацию которой я приводил выше на WSH и PoSH) — «танцевать вперёд», а не «пятится назад»: определить, какой раздел системный, получить его букву, по разделу получить содержащий его диск, и только потом смотреть, каков этот диск — MBR или GPT. |
Цитата:
Цитата:
|
m0nkrus, вот потому я и предлагаю другой путь — от буквы системного раздела к дисковому устройству (насчёт порта с наименьшим номером — немало раз видел иное: как недосборщику в голову взбредёт — так и будет; в любом случае, обоснованием корректности алгоритма сие не должно служить).
|
Цитата:
Цитата:
Вас уже куда-то не туда заносит, вам не кажется? Уже какие-то наезды непонятные пошли. Если вы не в состоянии понять, почему вариант с массивом работает, а с переменной нет, или почему я не хочу использовать PowerShell-скрипт при наличии альтернативы в виде CMD-скрипта, то это не повод на меня наскакивать. |
Цитата:
Цитата:
Цитата:
Цитата:
Ваш код у меня не работал. И при использовании «обратки» (смена «\*$» на «\ $») — тоже (кстати, и мой, сделанный по Вашему коду, в этой части — тоже не работал). Суть оказалась в том, |
|
m0nkrus, ну, так мне до этого нужно было ещё «дойти» ;).
|
На загрузочных GPT-дисках обязательно присутствует EFI в качестве 1-го системного раздела и MSR для 2-го. Информация об этом дается командой list partition. Поэтому принадлежность диска к GPT легко определить по типам раздела на диске.
|
m0nkrus, Iska, ITDemon, всё гениальное просто! Если не ошибаюсь, каждая копия Windows считает место хранения своего загрузочного тома не иначе как "диском 0", Вы проверьте :) Если загрузочный том всегда на диске 0, то:
Код:
@echo off На MBR WinXP и GPT Win8 проверил - работает корректно, подозреваю на остальных версиях тоже ;) |
Ксеноинженер, сейчас проверить уже не могу: под рукой не осталось машин, где ОС была бы установлена не на первый накопитель. Тем более — с GPT ;).
|
Ксеноинженер, увы, тоже проверить не на чем. Я системный диск всегда втыкаю в первый SATA-порт, так что он у меня в любом случае нулевой.
Хоть я и не могу сказать, работает ли ваша конструкция, но оптимизировать код, избавившись от внешнего файла, думаю, смогу. Ваше: Код:
echo Select Disk 0 >> diskpart.txt && echo detail disk >> diskpart.txt Код:
((echo select disk 0 && echo detail disk) ^| diskpart.exe) | findstr /c:"{" |
Добавил вывод ИД диска, для наглядности принятия решения скриптом.
Код:
@echo off Тем не менее, место хранения Загрузчика ОС есть Диск 0 всегда! В противном случае данная копия Windows "не загружабельна" без правки: любого имеющегося на Диске 0 загрузчика или BIOS, если загрузчика, на Диске 0, нет. Какой из SATA портов будет Диском 0 определяет первая строка в "Boot Sequence" в BIOS. Чтива полно на "железных" конференциях forum.oszone.net, ixbt.com. m0nkrus, оптимизация хороша, пригодится и для других задач тоже! |
Ксеноинженер, вот честно, не могу с уверенностью сказать, что мне нужно найти, где находится системный диск (скрытая 100-метровка) или загрузочный диск (диск С). Для первого случая ваш вариант подходит, для второго - не факт. Тут нужно тестировать, тестировать и еще раз тестировать. А не на чем...
Идея такой комплектации команд изначально не моя, а Iska. |
Цитата:
|
Ксеноинженер, я пробовал запустить установку винды на VirtualBox в UEFI-режиме - хрен вам!..
|
m0nkrus, действительно, не стоит с VirualBox связываться, ведь конкурент субъективно стабильнее. Моя тестовая платформа "GPT EFI Boot":
|
Цитата:
Однако, m0nkrus, как можно, не тестируя, серьёзно говорить про работу скрипта в предложенных Вами экзотичных вариантах системы? Краткая схема моих тестов:
Результат: В обоих случаях после стандартной установки и диск 0 под "Системным разделом" и диск N под "Загрузочным разделом" имеют один и тот же формат. Подозреваю, установщик Windows конвертирует чистый Диск 0 в формат диска под загрузочным разделом, выбранным во время установки, А если Диск 0 занят, то ошибка установки. Вывод: в "загружабельных" системах тип диска 0 и тип диска N под загрузочным разделом один и тот же, всегда. Какие ещё вопросы по теме топика? На практике наш с вами скрипт исправно работает, пусть и по косвенному признаку: ID Диска 0. |
Цитата:
|
Цитата:
Действительно схема нумерации дисков установщика Windows не привязана к BIOS и к номеру SATA порта. Сама MS здесь лукавит: when you install Windows Server 2012, Windows Server 2008 R2, Windows 8, or Windows 7, the installation creates a system partition alongside the Windows partition by default. The system partition is created to accommodate a Bitlocker requirement. Bitlocker requires that the boot files and Windows files are located on separate partitions. If the preselected default hard disk is not changed, the system partition is created on the disk that is detected as Disk 0. http://support.microsoft.com/kb/937251 http://support.microsoft.com/kb/937252 Пока это так, устанавливать ОС в MBR-системе на один из двух физ.дисков - играть в угадай-Ку. В MBR системе одно можно сделать с уверенностью -- на время установки ОС стОит отключать в BIOS/физически SATA-порты со всеми ПЗУ, кроме "системного"; вот тогда и скрипт будет работать исправно. В EFI системе такая привязка нумерации дисков к ОС Есть, и в случае установки ПервойОС на диск 0 всё чётко при любом количестве физ. дисков. Но тем не менее в EFI при установке ВторойОС на диск 1-N (первая на диске 0) рекомендую тоже отключать все ПЗУ, кроме "системного", (целиком логические диски не в счёт). Почему рекомендую? Да очень просто, чтобы загрузиться с первой или второй системы, достаточно будет сменить последовательность дисков в BIOS/EFI. Без шаманства с bootsect. В общем-то, привести в порядок свои диски в BIOS/EFI и устанавливать систему всегда на диск 0 - это элементарные правила! P.S. Правила есть в любой игре. ;) |
Ксеноинженер, предпочитаю скрипт, работающий всегда над скриптом, работающим по правилам.
|
Iska, m0nkrus,
а вы не пробовали для поиска системного диска применить DISKPART с параметром SEL DISK SYSTEM, а потом проверить GPT ? |
|
AnTaL, тут есть нюанс. Из справки по этой команде:
Цитата:
|
Цитата:
|
Albatross, родной, ты так, на секундочку, посмотри, в каком подфоруме ты пишешь...
|
Время: 02:06. |
Время: 02:06.
© OSzone.net 2001-