Войти

Показать полную графическую версию : [решено] Узнать, MBR или GPT?


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

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

zion87
24-04-2013, 20:36
@Echo Off
Set Sys=MBR
@Echo List Disk|Diskpart|Find /I "Gpt" && Set Sys=GPT

m0nkrus
24-04-2013, 23:45
zion87, ну вы бы хоть посмотрели, как команда List Disk в Diskpart отображает наличие GPT... Там столбец GPT, он всегда есть. Соответственно результат работы вашего скрипта будет всегда одинаков. А если раздел GPT, то это обозначается наличием звездочки в соответствующем столбце.

Вот так это выглядит:
http://www.symantec.com/business/support/library/BUSINESS/TECH156563/TECH156563B.png

Но бывает и такой вариант, так что ориентироваться ТОЛЬКО НА НАЛИЧИЕ ЗВЕЗДОЧКИ нельзя:
http://www.china-gsm.ru/Image2010_4/ff-6.jpg

Iska
25-04-2013, 02:42
m0nkrus, используйте такой подход:
Detect GPT and MBR partitions with Powershell - Stack Overflow (http://stackoverflow.com/questions/3840870/detect-gpt-and-mbr-partitions-with-powershell)
GPT oder MBR: Partitionierungsschema auslesen mit diskpart, wmic, PowerShell | WindowsPro (http://www.windowspro.de/tipp/gpt-mbr-partitionierungsschema-auslesen-diskpart-wmic-powershell)

P.S. У меня нет GPT под рукой, проверять и отлаживать пакетный файл не на чем.

m0nkrus
25-04-2013, 02:59
У меня нет GPT под рукой, проверять и отлаживать пакетный файл не на чем. »
Дык та же фигня... Приходится тестировщиков подключать, у кого оно есть.

За ссылки спасибо - гляну.

Iska
25-04-2013, 04:58
Посмотрите. Если делаете на сторону — может проще будет использовать как раз WSH, або PoSH.

m0nkrus
25-04-2013, 07:46
Iska, мне нужно эту выборку задействовать в SetupComplete.cmd автоустановки семерки. Так что CMD и только CMD.

P.S. Боюсь для решения моей проблемы по приведенным выше ссылкам инфы не наблюдается...

m0nkrus
25-04-2013, 09:42
Прикинул, покумекал... По логике, так как при выводе через DISKPART столбец GPT последний, а под элементы, даже если они отсутствуют, место резервируется, то таким образом видоизмененный вариант скрипта zion87 должен работать:
@Echo Off
Set Sys=MBR
@Echo List Disk | Diskpart | Findstr /R /C:"\*$" && Set Sys=GPTНо этот скрипт показывает лишь наличие или отсутствие в системе GPT-дисков. А мне бы хотелось узнать не является ли системный диск (диск С) GPT-диском. Ведь может быть и такое:
http://savepic.ru/4402754.jpg

Iska
25-04-2013, 11:22
На WSH:
Option Explicit

Dim strComputer
Dim objSWbemObjectEx
Dim strSystemDrive


strComputer = "."

With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(strComputer, "root\cimv2")
For Each objSWbemObjectEx In .ExecQuery("SELECT * FROM Win32_OperatingSystem")
strSystemDrive = objSWbemObjectEx.SystemDrive

Exit For
Next

For Each objSWbemObjectEx In .ExecQuery("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID='" & .Get("Win32_LogicalDisk.DeviceID='" & strSystemDrive & "'").DeviceID & "'} WHERE ResultClass = Win32_DiskPartition")
WScript.Echo "System drive:", strSystemDrive
WScript.Echo "Partition: ", objSWbemObjectEx.DeviceID
WScript.Echo "Type: ", objSWbemObjectEx.Type

If UCase(Left(objSWbemObjectEx.Type, 3)) = "GPT" Then
WScript.Echo "GPT"
Else
WScript.Echo "Not GPT"
End If
Next
End With

WScript.Quit 0

m0nkrus
25-04-2013, 11:25
Iska, ну я же сказал, что на WSH мне не пойдет...

Iska
25-04-2013, 11:51
Iska, ну я же сказал, что на WSH мне не пойдет... »
— Рэбе, куры сдохли…
— Ну, вот, а у меня ещё столько плодотворных идей было ;) А я Вам PoSH приготовил:
$sComputerName = "."

Get-WmiObject -ComputerName $sComputerName -Query "ASSOCIATORS OF {Win32_LogicalDisk.DeviceID='$((Get-WmiObject -ComputerName $sComputerName -Query "SELECT * FROM Win32_LogicalDisk WHERE DeviceID = '$((Get-WmiObject -ComputerName $sComputerName -Query "SELECT * FROM Win32_OperatingSystem").SystemDrive)'").DeviceID)'} WHERE ResultClass = Win32_DiskPartition" |`
Select-Object DiskIndex, @{Name="GPT";Expression={$_.Type.StartsWith("GPT")}}

Если серьёзно — я не видел последующей правки:
Iska, мне нужно эту выборку задействовать в SetupComplete.cmd автоустановки семерки. Так что CMD и только CMD. »
На этом этапе WSH не доступен? Или Wbem не работает?

Vadikan
25-04-2013, 13:17
powershell.exe можно вызвать из SetupComplete

m0nkrus
25-04-2013, 15:02
На этом этапе WSH не доступен? Или Wbem не работает? »
Вот чего не знаю, того не знаю. Но даже если работает, как из PowerShell передать обратно в CMD результат отработки вашего скрипта? Через вывод результатов во внешний файл?

Iska
25-04-2013, 15:22
как из PowerShell передать обратно в CMD результат отработки вашего скрипта? »
$sComputerName = "."

If((Get-WmiObject -ComputerName $sComputerName -Query "ASSOCIATORS OF {Win32_LogicalDisk.DeviceID='$((Get-WmiObject -ComputerName $sComputerName -Query "SELECT * FROM Win32_LogicalDisk WHERE DeviceID = '$((Get-WmiObject -ComputerName $sComputerName -Query "SELECT * FROM Win32_OperatingSystem").SystemDrive)'").DeviceID)'} WHERE ResultClass = Win32_DiskPartition").Type.StartsWith("GPT")) {
Exit 0
} Else {
Exit 1
}
(или «Return»; что правильнее — не знаю).
@echo off
setlocal enableextensions enabledelayedexpansion

.\БезИмени1.ps1

if %errorlevel% equ 0 (
echo GPT
) else (
echo Not GPT
)

endlocal
exit /b 0

P.S. Для верности, конечно, корректнее будет брать не 0 и 1, а какие-либо большие величины, заведомо превышающие те, которые может возвращать сам powershell.exe (например, в случае ошибок).

m0nkrus
25-04-2013, 15:29
Iska, спасибо, потестирую.

m0nkrus
25-04-2013, 20:58
Iska, так, что-то я уперся...

Я так понимаю, в прошлом вашем посте первое - это скрипт для PowerShell, который должен быть помещен в файл БезИмени1.ps1, так? Второе - cmd-файл, который и обращается к скрипту PowerShell и получает от него результат, так?

Так вот, не работает. Если оставить расширение ps1, то cmd-шник просто открывает ps1 блокнотом. А если расширение заменить на пауэршелловское psc1, то cmd просто вылетает на этой команде. Тот же эффект при замене строки .\БезИмени1.ps1 на PowerShell -PSConsoleFile БезИмени1.psс1

Что я делаю не так?


У меня, между тем, разработка скрипта на основе diskpart вышла на финишную прямую. Вот до чего я дошел:
CD /d %~dp0
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
DISKPART /s diskpart.txt | FINDSTR /e "Boot Загрузоч"
IF ERRORLEVEL 1 (
ECHO Загрузочный том размещен на MBR-разделе
) ELSE (
ECHO Загрузочный том размещен на GPT-разделе
)Что скажете? Хорошо бы оптимизировать.

Iska
25-04-2013, 23:25
Так вот, не работает. Если оставить расширение ps1, то cmd-шник просто открывает ps1 блокнотом. А если расширение заменить на пауэршелловское psc1, то cmd просто вылетает на этой команде. Тот же эффект при замене строки .\БезИмени1.ps1 на PowerShell -PSConsoleFile БезИмени1.psс1
Что я делаю не так? »
Что-то с безопасностью. Вообще — хоть какие-либо скрипты PowerShell'а работают? Посмотрите это: Running Windows PowerShell Scripts (http://technet.microsoft.com/en-us/library/ee176949.aspx) — как разрешить исполнение неподписанных локальных скриптов, и почему требуется указывать путь к скрипту.

Что скажете? »
У меня, например, не «Boot Загрузоч», а «Системны». Windows XP Professional, SP,3 RU.
Стоп. У Вас логика с errorlevel — мне не понятная. Словами опишите.

m0nkrus
26-04-2013, 10:11
Iska, с PowerShell посмотрю позже.

Логика с errorlevel простая: если в файле найдена ключевая строка, информирующая, что на ней размещен загрузочный диск (он в системе один), то ошибки нет и это GPT, если такой строки ни на одном из GTP-дисков не обнаружено, то, и поиск не дал результата - ошибка - значит по остаточному признаку загрузочным диском считать MBR.

Мы рассматриваем случай для семерки, не забыли? Случай с ХР - это за пределами ТЗ.

Iska
26-04-2013, 10:56
m0nkrus, спасибо, теперь ясно.

Мы рассматриваем случай для семерки, не забыли? Случай с ХР - это за пределами ТЗ. »
Ну, тогда сам бог велел PowerShell пользовать.

Ксеноинженер
26-04-2013, 19:52
m0nkrus, на тему оптимизации: логично было бы вместо detail disk использовать uniqueid disk, и если ID содержит "{" - то диск имеет GUID, и следовательно GPT.
@echo off
CD /d %~dp0
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
for /f "tokens=*" %%J IN ('Diskpart /s diskpart.txt ^| find "{"') DO (
if errorlevel==0 ( echo Загрузочный диск GPT
Set Sys=GPT
) else (
echo Загрузочный диск MBR
Set Sys=MBR
)
)
pause




© OSzone.net 2001-2012