Код:

@Echo Off
Title USB Manager
SetLocal EnableDelayedExpansion
Set err=0
Set cnt=0
Set choice=1
For /F "tokens=* delims=" %%a In ('usr list -s') Do Call :_parser "%%a"
If %cnt%==0 Exit
If %cnt%==1 GoTo :_OneDrv
Set choice=
Set disconnect=0
Set connect=0
Set buttons="Стоп все" "Вкл. все" "Отмена"
Set Mesg1=[Стоп все] - остановить все устройства~n[Вкл. все]~t - вернуть все устройства обратно~n~n
For /L %%i In (1,1,%cnt%) Do (
If "!status_drv%%i!"=="" (
Set connect=1
Set Mesg1=!Mesg1![Стоп !drv%%i!]~t - остановить устройство !drv%%i!~n
Set buttons=!buttons! "Стоп !drv%%i!"
) Else (
Set disconnect=1
Set Mesg1=!Mesg1![Вкл. !drv%%i!]~t - вернуть устройство !drv%%i! обратно *~n
Set buttons=!buttons! "Вкл. !drv%%i!"
)
)
If %connect%==1 (
rem Set Mesg1=!Mesg1!~n[Откл. все] - остановить все устройства
rem Set buttons=!buttons!"Откл. все"
)
If %disconnect%==1 (
Set Mesg1=!Mesg1!~n* Это действие также перезагрузит другие~n устройства, подключенные к USB хабу
rem Set Mesg1=!Mesg1!~n[Вкл. все] - вернуть все устройства обратно~n* Это действие также перезагрузит другие~n устройства, подключенные к USB хабу
rem Set buttons=!buttons!"Вкл. все"
)
7zbut -msgbox "!Mesg1!" "USB Manager" db1:fl33:bw85:bpl3 !buttons!>nul
Set presskey=!errorlevel!
If !presskey!==20 Exit
If !presskey!==1 (
Set cntRet=0
For /L %%i In (1,1,%cnt%) Do If "!status_drv%%i!"=="" (
Set /A cntRet +=1
Set drvc=!drv%%i!
Set listdrv=!listdrv!~n!fulldrv%%i!
Call :_Stop !drv%%i!
)
If !cntRet!==1 (
Call :_balloon "Устройство !drvc! остановлено"
) Else Call :_balloon "Остановлены устройства:!listdrv!"
Exit
)
If !presskey!==2 (
Set cntRet=0
For /L %%i In (1,1,%cnt%) Do If Not "!status_drv%%i!"=="" (
Set /A cntRet +=1
Set drvc=!drv%%i!
Set listdrv=!listdrv!~n!fulldrv%%i!
Call :_Return !drv%%i!
)
If !cntRet!==1 (
Call :_balloon "Устройство !drvc! возвращено обратно"
) Else Call :_balloon "Возвращены обратно устройства:!listdrv!"
Exit
)
If !presskey! GTR 20 Set /A choice=presskey - 20
:_OneDrv
If "!status_drv%choice%!"=="" (
Call :_Stop !drv%choice%!
Call :_balloon "Устройство !drv%choice%! остановлено"
) Else (
Call :_Return !drv%choice%!
Call :_balloon "Устройство !drv%choice%! возвращено обратно"
)
Exit
:_Return
usr return -d %~1 >Nul
GoTo :EOF
:_Stop
usr stop -d %1 >Nul
Set err=%errorlevel%
If %err%==0 GoTo :EOF
If %err%==2 (
usr wholocks -d %1>Nul
Set err=!errorlevel!
If !err!==5 GoTo :_message
If !err!==6 GoTo :_message
Set Mesg1=Устройство ~x28%1~x29 заблокировано и не может быть остановлено.~n~nФайл блокирующего процесса~n======================
Set cntPr=0
For /F "skip=4 tokens=1*" %%a In ('usr wholocks -d %1') Do Call :_lockproc "%%a" "%%b"
If "!cntPr!"=="1" (
Set Mesg1=!Mesg1!~n~n1. Остановить процесс ~q!proc!~q и повторить операцию~n2. ~qУбить~q процесс ~q!proc!~q и повторить операцию
) Else (
Set Mesg1=!Mesg1!~n~n1. Остановить ВСЕ блокирующие процессы и повторить операцию~n2. ~qУбить~q ВСЕ блокирующие процессы и повторить операцию
)
7zbut -msgbox "!Mesg1!" "USB Manager" db1:fl49 "1 вариант" "2 вариант" "Отмена">nul
Set presskey=!errorlevel!
If !presskey!==20 Exit
If !presskey!==1 usr forcedstop -d %1 >Nul
If !presskey!==2 For /L %%i In (1,1,!cntPr!) Do TaskKill /F /IM !proc%%i!>Nul
GoTo :_Stop
)
:_message
If %err%==1 Set Mesg=Устройство %1 не найдено
If %err%==3 Set Mesg=Неверный синтаксис команды
If %err%==4 Set Mesg=Неизвестная команда
If %err%==5 Set Mesg=Не найдены процессы блокирующие устройство %1 или оно уже свободно
If %err%==6 Set Mesg=Произошла ошибка при поиске процессов блокирующих устройство %1
Call :_balloon "%Mesg%"
GoTo :EOF
:_lockproc
Set /A cntPr +=1
rem Set tab=
Set proc=%~1
Set proc!cntPr!=%~1
rem If "!proc:~7,1!"=="" Set tab=~t
Set Mesg1=!Mesg1!~n%~2
GoTo :EOF
:_parser
Set /A cnt +=1
Set ta=%~1
Set fulldrv%cnt%=!ta:~3!
If Not "!ta!"=="!ta:safely removed=!" (
Set status_drv%cnt%=1
Set fulldrv%cnt%=!ta:~3,-20!
)
Set ta=!ta:*^(=!
Set drv%cnt%=!ta:~0,2!
GoTo :EOF
:_balloon
Start "" nircmd trayballoon "USB Manager" %1 "Zentimo.exe" 5000
Echo
GoTo :EOF