Цитата:
Сделайте кто-нибудь пожалуйста оптимизированный вариант для русской винды
|
Добавил автоопределение локализации и вынес типы переназначаемых устройств в заголовок. Если смещения изменятся теперь проще подкорректировать... Заменять старый вариант не стал если кто вдруг захочет разобраться в его работе или вдруг вылезет какая ошибка.
Код:

echo off
SETLOCAL ENABLEDELAYEDEXPANSION
Rem Тип обрабатываемых приводов и выделенные для них буквы
SET DRV_TYPE=DVD CD
SET DRV_FREE=N O P
Rem Проверка наличия DiskPart
DiskPart.Exe /? >nul 2>&1
IF %ERRORLEVEL% NEQ 0 (
Echo Файл DISKPART.EXE не найден, работа скрипта прервана!
PAUSE
EXIT
)
Rem Определение локализации DiskPart
DiskPart.Exe /?|Find "On computer:"
IF %ERRORLEVEL%==0 (
SET POS_VOL=7
SET POS_LTR=13
SET POS_TYP=37
) ELSE (
SET POS_VOL=4
SET POS_LTR=10
SET POS_TYP=34
)
Rem Формируем список устройств, фильтруем переназначенные ранее
FOR /F "skip=9 tokens=*" %%A IN ('@echo list volume^|@diskpart') Do (
SET LINE=%%A
SET DRV_USED=!DRV_USED! !LINE:~%POS_LTR%,1!
CALL :FIND !LINE:~%POS_LTR%,1! "%DRV_FREE%"
IF !ERRORLEVEL!==1 FOR %%B IN (%DRV_TYPE%) DO CALL :TEST_DRIVE %%B
)
Rem Перебор отобранных приводов и выполнение переназначения
FOR %%B IN (%VOL_WORK%) DO (
CALL :FindNext
CALL :ASSIGN %%B !LTR!
SET DRV_USED=!DRV_USED! !LTR!
)
EXIT
Rem Обработка очередной строки команды DiskPart "list volume"
:TEST_DRIVE
CALL :LENGTH %~1
IF "%~1"=="!LINE:~%POS_TYP%,%LENGTH%!" SET VOL_WORK=!VOL_WORK! !LINE:~%POS_VOL%,1!
GOTO :EOF
Rem Вычисление длины параметра
:LENGTH
SET LENBUF=%~1
SET LENGTH=0
IF "%~1"=="" GOTO :EOF
:LENGTH_START
SET /A LENGTH+=1
IF ""=="!LENBUF:~%LENGTH%,1!" GOTO :EOF
GOTO :LENGTH_START
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