Anton04
Цитата:
утилита то сама работает, а вот скрипт нет
|
угу, пробуй:
Код:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
Rem Тип обрабатываемых приводов и выделенные для них буквы
SET DRV_TYPE=DVD CD
SET DRV_FREE=N O P
Echo.
Echo.Progress: Проверяем наличие DiskPart...
DiskPart.Exe /? >nul 2>&1
IF %ERRORLEVEL% NEQ 0 (
Echo.
Echo.Progress: Файл DISKPART.EXE не найден, работа скрипта прервана!
PAUSE
EXIT
)
Echo.Progress: Определяем локализацию 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
)
echo.Progress: Вычисляем количество пропускаемых строк...
SET SKIP=0
FOR /F "tokens=1 delims=[]" %%A IN ('@echo list volume^|@diskpart^|find /N "DISKPART>"') Do IF !SKIP! EQU 0 SET /A SKIP=%%A+2
Echo.Progress: Формируем список устройств, фильтруем переназначенные ранее...
FOR /F "skip=%SKIP% 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
)
IF "%VOL_WORK%"=="" (
echo.
echo.Progress: Список переназначения пуст^^^! Скрипт завершил работу.
EXIT
)
Echo.Progress: Выполняем переназначение по сформированному списку...
Echo.
FOR %%A IN (%VOL_WORK%) DO (
CALL :FindNext
CALL :ASSIGN %%A !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|find /I "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.
Echo.Скрипт прерван^! Список свободных букв исчерпан.
EXIT