[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 7 лет 7 месяцев
  • Сообщений: 323
  • Репутация:35

    [+] [-]
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 и все, кого забыл упомянуть - за тестирование программы и ценные советы
Вложение

Версия 2.0



Последний раз редактировалось: Gemostarter (2019-07-24 17:04), всего редактировалось 8 раз(а)

[Цитировать]

    SV-2k10
  • 437
  • Стаж: 9 лет 7 месяцев
  • Сообщений: 266
  • Репутация:21

    [+] [-]
Gemostarter, Привет… aa
Да интересная утилитка !
Хоть такого рода программки и есть … но все равно спасибо !
Меня больше радует, что есть ребята которые что то пишут … стараются …
Сам я программки не пишу, так, если что то готовое под себя переделать, но тех которые чтобы то ни было делают – Уважаю !

[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 7 лет 7 месяцев
  • Сообщений: 323
  • Репутация:35

    [+] [-]
SV-2k10, спасибо за поддержку.
Перечитал описание, и понял, что даже не сказал, на какую кнопку жать, чтобы все сломать сделать ah Будем исправлять...

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 9 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Gemostarter, aa
53998парсить выхлоп локализованных версий не трудно, а невозможно)
Почему не возможно ?
Делается достаточно просто - нужные строки читаются непосредственно из ресурсов diskpart.exe (diskpart.exe.mui) по Spring ID , это гарантирует независимость от языка и версии файла.

[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 7 лет 7 месяцев
  • Сообщений: 323
  • Репутация:35

    [+] [-]
nikzzzz, aa
Дело не в строках. Дело в таблицах. Запустите diskpart.exe русской и английской версии, и наберите, допустим, list disk. И сравните результат. В инглише все ровненько, все как по линейке, любо-дорого взглянуть. В русской же версии многие слова преспокойно вылезают за пределы назначенных им областей. Как результат - не понятно, где что, и как этим заполнить таблицы в GUI, я, честно говоря, даже представить не могу.
Прога ведь - не GUI для diskpart, это GUI для упрощения запуска скриптов diskpart. И парсится лишь результат команд list disk, list partition, list volume, да и то, если введены они не пользователем вручную.
Вижу лишь один способ сделать версию, не зависящую от языка - использовать WinAPI. Лениво мне это.

[Цитировать]

    NeleGal-38
  • 122
  • Стаж: 9 лет
  • Сообщений: 506
  • Репутация:38

    [+] [-]
  • Откуда: Из леса вестимо
Gemostarter, aa
Не знаю может и пригодится.. В своей программе вывод информации Diskpart-а всегда на английском языке, для этого пишу такую строку:
cmd.exe /c chcp 65001 > nul & diskpart < dpartcmd.txt
Кстати ещё заметил что не всех версиях WinPE_x64 нормально запускается diskpart, через cmd нормально запускается, а через программу или батник не хочет. Небыло такой проблемы?

[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 7 лет 7 месяцев
  • Сообщений: 323
  • Репутация:35

    [+] [-]
NeleGal-38, я использую
cmd.exe /c (chcp 437) & (diskpart)
437 позволяет запускать это дело даже на XP, где 65001 отсутствует...

[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 7 лет 7 месяцев
  • Сообщений: 323
  • Репутация:35

    [+] [-]
54019заметил что не всех версиях WinPE_x64 нормально запускается diskpart, через cmd нормально запускается, а через программу или батник не хочет. Небыло такой проблемы?
Не сталкивался. А какие именно версии?

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 9 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
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

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 9 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
54019Кстати ещё заметил что не всех версиях WinPE_x64 нормально запускается diskpart, через cmd нормально запускается, а через программу или батник не хочет. Небыло такой проблемы?
Скорее всего в X64 системе X86 прога пытается запустить x86 версию diskpart, а ее просто нет или нет x86 библиотек для нее.

[Цитировать]

    NeleGal-38
  • 122
  • Стаж: 9 лет
  • Сообщений: 506
  • Репутация:38

    [+] [-]
  • Откуда: Из леса вестимо
Скорее всего в X64 системе X86 прога пытается запустить x86 версию diskpart, а ее просто нет или нет x86 библиотек для нее.
Кстати да, возможно именно из-за этого. Надо проверить!

[Цитировать]

    NeleGal-38
  • 122
  • Стаж: 9 лет
  • Сообщений: 506
  • Репутация:38

    [+] [-]
  • Откуда: Из леса вестимо
54027Скорее всего в X64 системе X86 прога пытается запустить x86 версию diskpart, а ее просто нет или нет x86 библиотек для нее.
Так оно и есть! Только не могу сообразить как сделать чтоб x86 запустила х64 версию diskpart. Код программы:
new Process(["cmd.exe", "/c chcp 65001 > nul & diskpart < dpartcmd.txt"]))->start();
Ещё минус в том что программу нужно собирать в обычной винде, а для проверки грузится в ПЕ, времени много уходит )))

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 8 месяцев
  • Сообщений: 3783
  • Репутация:127

    [+] [-]
NeleGal-38,
%SystemRoot%\Sysnative\cmd.exe

[Цитировать]

    NeleGal-38
  • 122
  • Стаж: 9 лет
  • Сообщений: 506
  • Репутация:38

    [+] [-]
  • Откуда: Из леса вестимо
Ander_73, aa
Неа, даже такой код не срабатывает ( в 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

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 9 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
NeleGal-38
54074PS папку 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)

Страница 1 из 7


Показать сообщения:    

Текущее время: 31-Окт 10:31

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы