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

    Gemostarter
  • 15956
  • Стаж: 1 год 6 месяцев
  • Сообщений: 128
  • Репутация:13

    [+] [-]
DiskPart ASC Графический интерфейс, несколько упрощающий применение скриптов DiskPart. Работает по схеме "выбрали диск/раздел/том, выбрали скрипт, нажали кнопку, а дальше все само поехало". Считаю, что это удобнее, чем каждый раз самому запускать DiskPart, чтобы узнать номер нужного диска, изменять нужный скрипт под этот номер, и снова запускать DiskPart, уже с этим скриптом, и все это руками, в командной строке.
Писалась как модуль к другой программе, но стала полностью самостоятельной, когда основной проект приказал долго жить.

Перед применением в программе скрипт должен быть специальным образом подготовлен:

1. Если хотим, чтобы в меню выбора скриптов отображалось осмысленное имя (а не имя файла), первой строкой в скрипте должно быть:
REM SCRIPTNAME:Имя скрипта
2. В то место, куда программа должна подставить сгенерированные команды выбора дисков/разделов/томов, нужно написать две строчки:
EXIT
%SELECT_COMMAND
Важно: в этих двух строках не должно быть больше никаких символов. Ни комментариев, ни пробелов, ничего. Формат конца строки должен быть в стиле Windows (возврат каретки + перевод строки). В противном случае программа просто не найдет, куда вставлять команды.
До и после этих двух строк можно размещать произвольные команды DiskPart.
3. Готовый скрипт кладем в папку DPSCRIPTS рядом с программой.
И еще: должен быть доступ на запись в %TEMP%, и сам каталог %TEMP% в системе должен существовать. В кривых сборках, особенно WinPE, всякое бывает...
В комплекте идут два скрипта, чисто как пример.

Как пользоваться:

Выбор дисков, разделов и томов производится на трех панелях в верхней части окна программы. Верхняя левая панель - список дисков, левая нижняя - список разделов выбранного диска, правая (самая большая) - список томов.
Чуть ниже расположено меню выбора скриптов (слева), и поле вода команд (справа). Рядом с полем ввода команд расположена кнопка запуска.
В поле ввода можно ввести команду "SC:Полный_путь_к_файлу" для запуска скриптов, лежащих вне папки "DPSCRIPTS", или не отобразившихся в списке. Либо можно ввести произвольную команду, она будет сразу передана DiskPart. Если ввести exit, завершится и DiskPart, и ASC.
В самом низу - поле вывода информации, сюда пишется код завершения DiskPart'а, запущенного со скриптом, а так же выхлоп команд, введенных в поле выше.

Примечания:

1. Программа может работать только с английской версией DiskPart (парсить выхлоп локализованных версий не трудно, а невозможно). Если в системе отсутствует нужный mui, программа попытается его добавить. Если вместо нормальной таблицы (как на скрине) в списках вы видите черти что, значит, ей это не удалось... И работать она не сможет, увы и жаль. Исправление этой ситуации потребует коренного изменения концепции.
2. Если программа ничего не делает, хотя все кнопки нажимаются, значит, что-то (или кто-то) завершило процесс diskpart.exe. К сожалению, закрыть программу в этом случае можно лишь через Диспетчер Задач.
3. Всегда запускайте версию, соответствующую разрядности ОС, в которой работаете. Во избежание.
Использовать на свой страх и риск... bb
Вложение

Версия 1.0



Последний раз редактировалось: Gemostarter (2018-05-21 03:12), всего редактировалось 2 раз(а)

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

    SV-2k10
  • 437
  • Стаж: 3 года 7 месяцев
  • Сообщений: 299
  • Репутация:20

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

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

    Gemostarter
  • 15956
  • Стаж: 1 год 6 месяцев
  • Сообщений: 128
  • Репутация:13

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

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

    nikzzzz
  • 215
  • Стаж: 3 года 8 месяцев
  • Сообщений: 2464
  • Репутация:127

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

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

    Gemostarter
  • 15956
  • Стаж: 1 год 6 месяцев
  • Сообщений: 128
  • Репутация:13

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

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

    NeleGal-38
  • 122
  • Стаж: 3 года 9 месяцев
  • Сообщений: 303
  • Репутация:19

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

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

    Gemostarter
  • 15956
  • Стаж: 1 год 6 месяцев
  • Сообщений: 128
  • Репутация:13

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

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

    Gemostarter
  • 15956
  • Стаж: 1 год 6 месяцев
  • Сообщений: 128
  • Репутация:13

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

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

    nikzzzz
  • 215
  • Стаж: 3 года 8 месяцев
  • Сообщений: 2464
  • Репутация: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
  • Стаж: 3 года 8 месяцев
  • Сообщений: 2464
  • Репутация:127

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

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

    NeleGal-38
  • 122
  • Стаж: 3 года 9 месяцев
  • Сообщений: 303
  • Репутация:19

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

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

    NeleGal-38
  • 122
  • Стаж: 3 года 9 месяцев
  • Сообщений: 303
  • Репутация:19

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

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

    Ander_73
  • 15549
  • Стаж: 1 год 8 месяцев
  • Сообщений: 698
  • Репутация:56

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

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

    NeleGal-38
  • 122
  • Стаж: 3 года 9 месяцев
  • Сообщений: 303
  • Репутация:19

    [+] [-]
  • Откуда: Из леса вестимо
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
  • Стаж: 3 года 8 месяцев
  • Сообщений: 2464
  • Репутация: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 из 2


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

Текущее время: 16-Окт 18:58

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


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