PDA

Показать полную графическую версию : [решено] Получить список дисков\разделов


id334492052@vk
18-12-2015, 06:39
Все доброго дня! Будьте добры, помогите советом... Создаю массивный сценарий для восстановления файлов загрузчиков разных версий Windows , всё в принципе работает, всё прекрасно - кроме одного момента в самом начале сценария. Никак не могу автоматизировать следующий процесс : необходимо получить список физических дисков, затем разделов на выбранном диске, затем буквы выбранного раздела - и выполнить копирование нескольких файлов в корень выбранного раздела. И всё это в пошаговое меню, аналогично diskpart - только без ввода команд, а с выбором вариантов. Реально, как считаете ?

greg zakharov
18-12-2015, 09:55
Не совсем ясно, что мешает использовать тот же diskpart, ведь вышеобозначенные операции все равно по сути требуют наличия прав администратора? Так, например, чтобы получить список дисков:
echo list disk | diskpart | findstr /vrc:"\." | findstr [0-9]
Или размелов:
echo list volume | diskpart | findstr /vrc:"\." | findstr [0-9]
Полученные данные прогнать через for и все.
Есть и альтернативные решения, по крайней мере относительно активного жесткого диска и его разделов.
typeperf
@echo off
setlocal&chcp 1251>nul
for /f "tokens=2 delims=)(" %%i in (
'typeperf -qx "\Физический диск" ^| findstr /rc:"\:"'
) do set "active=%%i"
for %%i in (%active%) do (
(echo:%%i|>nul findstr [0-9])&&(
echo:Disk %%i
)||(
echo:Volume %%i
)
)
endlocal&chcp 866>nul
exit /b
Реестр
Получить разделы активного жесткого диска можно через реестр.
@echo off
setlocal enabledelayedexpansion
set "key=HKLM\SYSTEM\MountedDevices"
for /f "tokens=1,3" %%i in (
'reg query %key% ^| findstr /rc:"\?"'
) do (
for /f "tokens=1,3" %%k in (
'reg query %key% ^| 2^>nul findstr %%j ^| findstr /rc:"\:"'
) do (
if "%%j" equ "%%l" set "drv=%%k"
set "drv=!drv:\DosDevices\=!"
echo !drv! %%i
)
)
endlocal
exit /b
Или mountvol.
Получить разделы активного жесткого диска также можно через гибридную технику - CMD\JS.
0</* :
@cscript /nologo /e:jscript "%~f0" %*&exit /b */0;
(function() {
with (new ActiveXObject('Scripting.FileSystemObject')) {
for (var e = new Enumerator(Drives); !e.atEnd(); e.moveNext()) {
if (e.item().DriveType === 2) WScript.echo(e.item().Path);
}
}
}());
Есть и другие варианты и способы решения задачи, но перечислять их все довольно утомительно.

id334492052@vk
18-12-2015, 14:14
спасибо большое ! очень помогло, схоронил.

а что касательно прикручивания меню и создание переменной не подскажете? допустим командой echo list disk | diskpart | findstr /vrc:"\." | findstr [0-9] - я получил список дисков. Теперь нужно основываясь на полученных данных создать меню, где кол-во пунктов = кол-ву найденных дисков. Затем от пользователя потребуется ввод номера диска, сбросить выбранный вариант в переменную, чтобы дальше работать с этим диском. Затем то же самое с выбором раздела именно на выбранном диске. То есть возможно ли в итоге получить три переменные, где 1 - имя выбранного диска, 2 - имя раздела, 3 - буква раздела (с которой скрипт и будет работать дальше), если буквы нет - смонтировать ?

id334492052@vk
18-12-2015, 14:48
"Не совсем ясно, что мешает использовать тот же diskpart" - если его можно поместить рядом со скриптом и он будет работать в любых PE средах, то конечно можно... но хотелось бы как то автоматизировать и упростить, где от пользователя потребуется только ввод номера, а не всей команды к diskpart.

greg zakharov
18-12-2015, 16:05
Сперва просите просто направить дао в нужное русло, теперь по сути просите реализовать за Вас некую систему, - резонно спросить: какова цена вопроса? Если расчитываете на "даром", то ждите ответа других.

id334492052@vk
18-12-2015, 16:37
нет, реализация системы тут не при чем. А в принципе проблема решилась достаточно просто ... попросил знакомого написать простой автономный инсталлятор , позволяющий выбрать диск и раздел, в корень которого необходимо извлечь файлы. Наличие буквы как и среды , в которой он запускается - не играет никакой роли (уже импровизация, что лично по мне - очень удачно). Так что можно тему считать закрытой.




© OSzone.net 2001-2012