[Quote]

    Gemostarter
  • 15956
  • Longevity: 7 years 8 months
  • Posts: 323
  • REPUTATION: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 и все, кого забыл упомянуть - за тестирование программы и ценные советы
Attachments

Версия 2.0



Last edited by Gemostarter on 2019-07-24 17:04; edited 8 times in total

[Quote]

    SV-2k10
  • 437
  • Longevity: 9 years 9 months
  • Posts: 266
  • REPUTATION:21

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

[Quote]

    Gemostarter
  • 15956
  • Longevity: 7 years 8 months
  • Posts: 323
  • REPUTATION:35

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years
  • Posts: 3114
  • REPUTATION:127

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

[Quote]

    Gemostarter
  • 15956
  • Longevity: 7 years 8 months
  • Posts: 323
  • REPUTATION:35

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

[Quote]

    NeleGal-38
  • 122
  • Longevity: 9 years
  • Posts: 506
  • REPUTATION:38

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

[Quote]

    Gemostarter
  • 15956
  • Longevity: 7 years 8 months
  • Posts: 323
  • REPUTATION:35

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

[Quote]

    Gemostarter
  • 15956
  • Longevity: 7 years 8 months
  • Posts: 323
  • REPUTATION:35

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years
  • Posts: 3114
  • REPUTATION: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

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years
  • Posts: 3114
  • REPUTATION:127

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

[Quote]

    NeleGal-38
  • 122
  • Longevity: 9 years
  • Posts: 506
  • REPUTATION:38

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

[Quote]

    NeleGal-38
  • 122
  • Longevity: 9 years
  • Posts: 506
  • REPUTATION:38

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

[Quote]

    Ander_73
  • 15549
  • Longevity: 7 years 10 months
  • Posts: 3835
  • REPUTATION:127

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

[Quote]

    NeleGal-38
  • 122
  • Longevity: 9 years
  • Posts: 506
  • REPUTATION:38

    [+] [-]
  • Location: Из леса вестимо
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

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years
  • Posts: 3114
  • REPUTATION: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)

Page 1 of 7


Display posts:    

Current time is: 04-Dec 18:21

All times are UTC + 3


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum