Цитата:
буду рад если кто-нибудь оптимизирует
добро... тогда вот что получилось, удалось обойтись без временных файлов:
Код:
Код: Выделить всё
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
Rem Выделенные для приводов буквы
SET DRV_FREE=X Y Z
Rem Формируем список устройств, фильтруем переназначенные ранее
FOR /F "skip=9 tokens=*" %%A IN ('@echo list volume^|@diskpart') Do (
SET LINE=%%A
SET DRV_USED=!DRV_USED! !LINE:~13,1!
CALL :FIND !LINE:~13,1! "%DRV_FREE%"
IF !ERRORLEVEL!==1 (
IF "DVD"=="!LINE:~37,3!" SET VOL_WORK=!VOL_WORK! !LINE:~7,1!
IF "CD"=="!LINE:~37,2!" SET VOL_WORK=!VOL_WORK! !LINE:~7,1!
)
)
Rem Перебор отобранных приводов и выполнение переназначения
FOR %%B IN (%VOL_WORK%) DO (
CALL :FindNext
CALL :ASSIGN %%B !LTR!
SET DRV_USED=!DRV_USED! !LTR!
)
EXIT
Rem Вызов команды назначения
:ASSIGN
(@echo select volume %~1&@echo assign letter=%~2)|diskpart
GOTO :EOF
Rem Вызов команды FIND
:FIND
@echo %~2|@find "%~1">nul
GOTO :EOF
Rem Поиск свободной буквы из заданного множества
:FindNext
For %%i in (%DRV_FREE%) Do (
@echo.%DRV_USED%|Find "%%i">nul
IF !ERRORLEVEL!==1 (
SET LTR=%%i
GOTO :EOF
)
)
@echo Скрипт прерван. Список свободных букв исчерпан.
EXITВАЖНО! В русском DiskPart положение значений сдвинуто относительно оригинального, мои смещения сделаны для английского варианта, поэтому нужно откорректировать вхождения на свои: ~7, - номер тома; ~37, - тип тома; ~13, - буква диска.
