DiskPart Advanced Script ConsoleАвтор: GeStart Live a.k.a GemoStarter Системные требования: Windows XP или новее DiskPart ASC - Программа, предназначенная для упрощения использования скриптов для программы DiskPart, встроенного в Windows консольного менеджера разделов. Использование ASC устраняет необходимость всякий раз перед использованием скрипта сверяться со списком имеющихся дисков и изменять скрипт, подставляя в него номера нужных дисков и разделов. После запуска ASC будет выведен список всех доступных для работы физических дисков. После выбора диска будет выведена более детальная информация о нём, а так же список имеющихся на нём разделов. После выбора раздела будет отображена более детальная информация о нём. Выбрав диск и, если нужно, раздел, можно будет выбрать один из заранее подготовленных скриптов в выпадающем списке. После нажатия кнопки "Run Script" ASC автоматически подставит номера диска и раздела в нужные места скрипта, и передаст его присутствующему в системе diskpart.exe. ОСТОРОЖНО: В архиве с программой присутствуют два скрипта. Они удаляют с диска имеющуюся таблицу разделов (командой CLEAN), создают новую таблицу GPT или MBR (зависит от скрипта) и структуру разделов для установки Windows. Скрипты приложены, в основном, для демонстрации функционала, но полностью работоспособны, и при случайном запуске не на том диске обрекут вас на долгое и мучительное восстановление информации.
О скриптах:
Автоматическая подстановка номеров диска и раздела в скрипт достигается за счёт использования в скрипте переменных: #ANTI# - Заглушка, предотвращающая случайный запуск скрипта без ASC, рекомендуется размещать первой строкой #DISK# - Номер диска #PART# - Номер раздела #VOLU# - Номер тома, соответствующего #PART# #PSTL# - Стиль разделов диска #DISK# #GSEC# - Размер сектора #DISK# из информации о геометрии диска #PSEC# - Размер физического сектора #DISK# (не все диски его сообщают) #LSEC# - Размер логического сектора #DISK# (не все диски его сообщают) #MNTP# - Точка монтирования раздела #PART# (без конечного "\") #MNTPF№# - Свободная буква диска, № это номер свободной буквы, если букв не хватит для всех номеров, скрипт не запустится В скриптах поддерживаются простые вычисления. Выражение должно быть заключено в фигурные скобки,например: { 2 * 2 } На место этого выражения будет подставлен его результат, то есть 4. Вкладывать выражения друг в друга нельзя! Ошибки внутри выражений не проверяются, будьте внимательны. Поддерживаются операторы: ^ - Возведение в степень * - Умножение / - Деление + - Сложение - - Вычитание Не все йогурты одинаково полезны, и не все скрипты одинаково хорошо подходят для разных сценариев работы. К примеру, скрипт, написанный для MBR-дисков, будет непригоден для работы с GPT, и наоборот. Кроме того, некоторым скриптам достаточно выбрать только диск, другим же необходимо знать и раздел. Отсеять безусловно неподходящие скрипты поможет соблюдение шаблона именования: DPMGRSEAU.AnyText Собственно шаблоном здесь является DPMGRSEAU, то есть текст, располагающийся до первой точки. Всё, что находится после неё, игнорируется программой. D - Для работы скрипту необходим номер диска P - Необходим номер раздела M - Поддерживается стиль разделов MBR G - Поддерживается стиль разделов GPT R - Поддерживаются RAW-диски (без таблицы разделов) S - Поддерживаются диски со стандартным форматом сектора (512 байт как физически, так и логически) E - Поддерживаются диски с форматом сектора 512e (4096 байт физически, 512 байт логически) A - Поддерживаются диски с форматом сектора 4K (4096 байт как физически, так и логически) U - Поддерживаются диски с неизвестным форматом сектора (любые другие комбинации, в том числе если диск не сообщает размер #PSEC# и #LSEC#) Если скрипт может работать с любым стилем разделов и RAW, то можно не указывать стиль в шаблоне. Если размер сектора не играет роли, в шаблоне нужно указать 0 либо не указывать чисел вовсе. Если скрипт может работать без диска, раздела, вне зависимости от стиля разделов и размера сектора, шаблон можно оставить пустым. Можно и удалить шаблон вовсе, но во избежание неожиданного поведения лучше указать пустой. То есть .AnyText
Интерфейс:
1 - Список дисков 2 - Детальная информация о диске, выбранном в 1 3 - Список разделов на диске, выбранном в 1 4 - Детальная информация о разделе, выбранном в 3 5 - Список скриптов 6 - Запуск скрипта, выбранного в 5 7 - Запуск DiskPart без скрипта (для ручной работы)
Благодарности:
sergeysvirid, Adler, nikzzzz, vovan1982, Ander_73 и все, кого забыл упомянуть - за тестирование программы и ценные советы
Последний раз редактировалось: Gemostarter (2019-07-24 17:04), всего редактировалось 8 раз(а)
Gemostarter, Привет… Да интересная утилитка ! Хоть такого рода программки и есть … но все равно спасибо ! Меня больше радует, что есть ребята которые что то пишут … стараются … Сам я программки не пишу, так, если что то готовое под себя переделать, но тех которые чтобы то ни было делают – Уважаю !
53998парсить выхлоп локализованных версий не трудно, а невозможно)
Почему не возможно ? Делается достаточно просто - нужные строки читаются непосредственно из ресурсов diskpart.exe (diskpart.exe.mui) по Spring ID , это гарантирует независимость от языка и версии файла.
nikzzzz, Дело не в строках. Дело в таблицах. Запустите diskpart.exe русской и английской версии, и наберите, допустим, list disk. И сравните результат. В инглише все ровненько, все как по линейке, любо-дорого взглянуть. В русской же версии многие слова преспокойно вылезают за пределы назначенных им областей. Как результат - не понятно, где что, и как этим заполнить таблицы в GUI, я, честно говоря, даже представить не могу. Прога ведь - не GUI для diskpart, это GUI для упрощения запуска скриптов diskpart. И парсится лишь результат команд list disk, list partition, list volume, да и то, если введены они не пользователем вручную. Вижу лишь один способ сделать версию, не зависящую от языка - использовать WinAPI. Лениво мне это.
Gemostarter, Не знаю может и пригодится.. В своей программе вывод информации Diskpart-а всегда на английском языке, для этого пишу такую строку: cmd.exe /c chcp 65001 > nul & diskpart < dpartcmd.txt Кстати ещё заметил что не всех версиях WinPE_x64 нормально запускается diskpart, через cmd нормально запускается, а через программу или батник не хочет. Небыло такой проблемы?
54019заметил что не всех версиях WinPE_x64 нормально запускается diskpart, через cmd нормально запускается, а через программу или батник не хочет. Небыло такой проблемы?
54018Дело не в строках. Дело в таблицах. Запустите diskpart.exe русской и английской версии, и наберите, допустим, list disk. И сравните результат. В инглише все ровненько, все как по линейке, любо-дорого взглянуть. В русской же версии многие слова преспокойно вылезают за пределы назначенных им областей.
Так таблицы вообще легко парсятся не зависимо от языка, пример - list disk
$Str = ' Раздел 1 Основной 19 Gб 31 Kб' & @CRLF $Str &= ' Раздел 2 Основной 30 Gб 19 Gб' & @CRLF $Array = StringRegExp($Str, '(?m-s)^ +.*? (\d+) +([^ ]+) +(\d+) +([^ ]+) +(\d+) +(.*)', 4) For $i = 0 To UBound($Array) - 1 $Array1 = $Array[$i] For $i1 = 1 To UBound($Array1) - 1 ConsoleWrite('<' & $Array1[$i1] & '>') Next ConsoleWrite(@CRLF) Next
54019Кстати ещё заметил что не всех версиях WinPE_x64 нормально запускается diskpart, через cmd нормально запускается, а через программу или батник не хочет. Небыло такой проблемы?
Скорее всего в X64 системе X86 прога пытается запустить x86 версию diskpart, а ее просто нет или нет x86 библиотек для нее.
54027Скорее всего в X64 системе X86 прога пытается запустить x86 версию diskpart, а ее просто нет или нет x86 библиотек для нее.
Так оно и есть! Только не могу сообразить как сделать чтоб x86 запустила х64 версию diskpart. Код программы: new Process(["cmd.exe", "/c chcp 65001 > nul & diskpart < dpartcmd.txt"]))->start(); Ещё минус в том что программу нужно собирать в обычной винде, а для проверки грузится в ПЕ, времени много уходит )))
Ander_73, Неа, даже такой код не срабатывает ( в Win_10_PE_x64 ) $text = new Process(["C:\\Windows\\SysWOW64\\cmd.exe", "/c ping ya.ru"])->start()->getInput()->readFully(); var_dump($text); Хотя в обычной Windows 10 x64 пингует нормально PS папку Sysnative не нашёл в WinPE
Так ее и не существует, это на самом деле папка system32, но если x32 приложение запускает что-то из system32, система подменяет system32 на syswow64. Эта виртуальная папка и сделана, чтобы избежать этой подмены. Вот пример x32 приложения, который запустит x64 версию DiskPart.
Func _Encoding_OEM2ANSI($strText) Local $sBuffer = DllStructCreate("char[" & StringLen($strText) + 1 & "]") Local $aRet = DllCall("User32.dll", "int", "OemToChar", "str", $strText, "ptr", DllStructGetPtr($sBuffer)) If Not IsArray($aRet) Then Return SetError(1, 0, '') If $aRet[0] = 0 Then Return SetError(2, $aRet[0], '') Return DllStructGetData($sBuffer, 1) EndFunc ;==>_Encoding_OEM2ANSI Func _DiskPart($String) Local $SysPath=@WindowsDir & '\system32' If EnvGet('PROCESSOR_ARCHITEW6432')<>'' Then $SysPath=@WindowsDir & '\sysnative' Local $iPID = Run($SysPath & '\diskpart.exe', "",@SW_HIDE , 7) StdinWrite($iPID,$String) ProcessWaitClose($iPID) Return _Encoding_OEM2ANSI(StdoutRead($iPID)) EndFunc ;==>_RunGetStdOut $sRes=_DiskPart('list disk' & @CRLF & "exit" & @CRLF) $sRes=StringReplace($sRes,'diskpart> ' & @CRLF ,'') MsgBox(4096,'DiskPart',$sRes)
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы