@echo off color 9e if not exist ListUsbDrives.exe Echo Положите ListUsbDrives.exe рядом с %0&goto:End CALL:flash_select $A $B $H $F echo.#-------------------------- Echo Меню:%$B% Echo Номер пункта меню:%$A% Echo Хард дисков:%$H% Echo Флэш дисков:%$F% ::: 0 = CANCEL, т.е. признак ВЫХОДА if '%$B%'=='' echo Флэшка не выбрана. Прервано пользователем. & goto :End if '%$B%'=='"0"' echo Флэшка не выбрана. Прервано пользователем. & goto :End set Ghost_of_Flash=%$B:~-6,-3% echo Ghost Partition Name (ghost-имя флэшки):%Ghost_of_Flash% Echo.Сейчас Вам будет предложено выбрать разворачиваемый образ GHO... pause set FILE_NAME="" chcp 1251>nul & REM Смена кодовой страницы необходима для поддержки русского языка call:dialog FILE_NAME chcp 866>nul & REM Возврат кодовой страницы Echo.Выбран файл: %FILE_NAME%, ::: Пустое имя = CANCEL, т.е. признак ВЫХОДА if '%FILE_NAME%'=='' echo Файл %FILE_NAME% не задан! Прервано пользователем. & goto :End ::: На случай, если имя файла подправлялось руками, нужно сделать проверку существования if not exist %FILE_NAME% echo Файл %FILE_NAME% не существует! & goto :End rem Echo....здесь нужно провести анализ имени диска и rem Echo переформатировать его под стандарт Ghost-а set BUKVA=%FILE_NAME:~1,3% set ghost= call:ghost_name %BUKVA% ghost set FILE_NAME=%ghost%\%FILE_NAME:~4,-1% rem echo.%FILE_NAME% Echo. ... Echo. ... Echo. ... Echo.Вы выбрали файл %FILE_NAME% Echo.для разворачивания на флэш-диск %Ghost_of_Flash% Echo. ... Echo. ... Echo. ... Echo.далее идет распаковка файла %FILE_NAME% на диск %Ghost_of_Flash% pause :End echo.Конец pause del /f /q *.log exit /b REM ::::::::::::::::::::::: ::::::::::::::::::::::::::: ::::::::::::::::::::::::::: REM ::::::: Далее идут используемые "подпрограммы" REM ::::::::::::::::::::::: ::::::::::::::::::::::::::: ::::::::::::::::::::::::::: REM ::::::::::::::::::::::: ::::::::::::::::::::::::::: ::::::::::::::::::::::::::: :flash_select setlocal EnableExtensions EnableDelayedExpansion Set #MODE=Flash Select Echo.# : Анализ оборудования. Echo.# : Наличие кардридеров или сбойных USB-устройств увеличивает задержку... Set TargetFlash= set /a #N=151 ListUsbDrives.exe -a >#ListAllDrives.log ListUsbDrives.exe >#ListUsbDrives.log Set Hards=0 Set FLDD=0 REM ::: Подсчет КОЛИЧЕСТВА ФИЗИЧЕСКИХ и ЛОГИЧЕСКИХ Set /a Logical=0 for /f "tokens=1,2 delims==" %%i in ('more +5 #ListAllDrives.log ^| find "Partition Name"' ) do ( set d=%%j set d=!d: \Device\Harddisk=#! set d=!d:\Partition=,! set /a d=!d:#=!+0 if /i !d! GTR !Hards! Set /a Hards=!d! Set /a Logical=!Logical!+1 ) REM ::: Список СЪЕМНЫХ ДИСКОВ в формате (hdX,Y) и dd:pp Set #pr=11 for /f "tokens=1,2 delims==" %%i in ('more +5 #ListUsbDrives.log ^| find "Partition Name"' ) do ( set d=%%j set d=!d: \Device\Harddisk=#! set d=!d:\Partition=,! set p=!d:#0=!&set p=!p:#1=!&set p=!p:#2=!&set p=!p:#3=!&set p=!p:#4=! set p=!p:#5=!&set p=!p:#6=!&set p=!p:#7=!&set p=!p:#8=!&set p=!p:#9=! set p=!p:0,=!&set p=!p:1,=!&set p=!p:2,=!&set p=!p:3,=!&set p=!p:4,=!&set p=!p:5,=! set p=!p:6,=!&set p=!p:7,=!&set p=!p:8,=!&set p=!p:9,=!&set p=!p:,=! set /a p=!p! -1 set /a d=!d:#=!+0 Set hdXY=^(hd!d!,!p!^) ### Set $$!#pr:~1!=!hdXY:~0,9! Set /a #pr=!#pr!+1 Set /a FLDD=!FLDD!+1 ) Set /a Hards=!Hards! +1-!FLDD! REM ::: ПРОВЕРКА СЪЕМНЫХ ДИСКОВ на CardReader for /f "tokens=* delims=" %%i in ('more +5 #ListUsbDrives.log ^| find "CardReader" /i /c' ) do Set #CardReader=%%i REM ::: ПРОВЕРКА СЪЕМНЫХ ДИСКОВ на траблы for /f "tokens=* delims=" %%i in ('more +5 #ListUsbDrives.log ^| find "no media" /i /c' ) do Set #nomedia=%%i REM ::: РАЗБИВКА #ListUsbDrives.log ПО УСТРОЙСТВАМ (БУКВАМ) Set #z#=** Set #device=-& Set #partition=-& Set #types=---&Set #FrName=--- for /f "tokens=1,2 delims==" %%a in ('more +5 #ListUsbDrives.log' ) do ( Set #aa=%%a Set #bb=%%b if "!#aa!"=="MountPoint " ( IF not :!#z#!:==:**: call:flash_info_create !#z#! #label #uuid Set #z#=!#bb:~1,2! Set #device=-& Set #partition=-& Set #types=---&Set #FrName=--- ) else ( if "!#aa!"=="Partition Name " Set #device=!#bb:~17,2!>nul&Set #device=!#device:\=!>nul if "!#aa!"=="Partition Number " Set /a #partition=!#bb!>nul 2>nul& Set /a #partition=!#partition!-1>nul if "!#aa!"=="Device Types " Set #types=!#bb:~1,17!>nul if "!#aa!"=="Friendly Name " Set #FrName=!#bb:~1,17!>nul ) ) IF not :!#z#!:==:**: call:flash_info_create !#z#! #label #uuid set /a #N=101 CALL:create_.NN "ВСЕГО USB ДИСКОВ: %FLDD%" CALL:create_.NN " КАРДРИДЕРЫ: %#CardReader%" CALL:create_.NN "ФИЗИЧЕСКИХ ЖЕСТКИХ ДИСКОВ: %Hards%" CALL:create_.NN " ВСЕГО ЛОГИЧЕСКИХ ДИСКОВ: %Logical%" CALL:create_.NN "-------------------------------------------------------------------" CALL:create_.NN " :Disk: Disk Volume : UUID :Menu.lst: comment : Ghost" CALL:create_.NN "---------+----+-------------+-----------+--------+----------+------" set .2a=- FOR /F "tokens=*" %%i in ('Set .2 ^| find "2a" /v ^| find "2" /c') do ( if NOT :%%i:==:0: set /a #N=150&CALL:create_.NN "---------+----+-------------+-----------+--------+----------+------" ) set .2a= :flash_select_qu CALL:choice_select "Выберите из списка ФЛЭШКУ" "Съемные диски" IF %#User_Select%=="0" EXIT /b IF %#User_Select:~1,1%==0 goto:flash_select_qu REM ::: ВЫВОД значений #User_Select и #Choice ЗА ПРЕДЕЛЫ endlocal !!!!!!!!!!! endlocal &set %1=%#User_Select%&set %2=%#Choice%&set %3=%Hards%&set %4=%FLDD% Set /a #User_Select=%$A%+0>nul 2>nul Set #Choice=%$B% Set Hards=%$H% Set FLDD=%$F% Set F_hd=%$B:~4,5% Set F_hd=%F_hd:)=% Set /a F_hd=%F_hd%+0>nul 2>nul IF /i %#User_Select% LSS 51 Echo.# :--^| ОТМЕНА. ФЛЭШКА НЕ ВЫБРАНА. & goto:info Set TargetFlash=%#Choice:~12,2% Echo.# :--^| Echo.# :--^| Echo.# :--^| ВЫБРАНА ФЛЭШКА %TargetFlash% (%#Choice:~17,11%) :info Set InfoFlash=%#Choice:~12,2% REM ::: ИНФОРМАЦИЯ из #ListUsbDrives.log ПО ВЫБРАННОЙ ФЛЭШКЕ setlocal EnableExtensions EnableDelayedExpansion Set #z#=** for /f "tokens=1,2 delims==" %%a in ('more +5 #ListUsbDrives.log' ) do ( Set #bb=%%b if "%%a"=="MountPoint " Set #z#=!#bb:~1,2! if :!#z#!:==:!InfoFlash!: Echo.# :--^| %%a:!#bb:~0,50! ) endlocal exit /b REM ::::::::::::::::::::::: ::::::::::::::::::::::::::: ::::::::::::::::::::::::::: :flash_info_create set $#=[hd%#device%,%#partition%] ### set $#=%$#:~0,9% set /a dd=%#device%+1 set /a pp=%#partition%+1 Set hdGh=%dd%:%pp% ### set hdGh=%hdGh:~0,5% set #types=%#types:---=% if "%#types%"=="" set #types=%#FrName% del /q ##vol.log>nul 2>nul vol %1 >#vol.log 2>##vol.log Call:get_file_size ##vol.log Set #label= IF NOT :%#FileSize%:==:0: goto:not_ready REM Определим label диска и его UUID setlocal EnableExtensions EnableDelayedExpansion Set #=1 for /f "tokens=* delims=" %%i in ('type #vol.log') do ( Set /a #=#+1 for %%t in ( %%i) do Set .!#!=%%t) endlocal &set %2=%.2% &set %3=%.3% &REM set #label=%#label:метки.=% for /F %%n in (' dir %1\*.* ^| find "Menu.lst" /i /c ') do if "%%n"=="0" Set #menu= -- for /F %%n in (' dir %1\*.* ^| find "Menu.lst" /i /c ') do if "%%n"=="1" Set #menu= есть set #types=%#types% ### CALL:create_.NN "%$#%: %1 : %#label:~0,11% : %#uuid:~0,9% : %#menu% :%#types:~0,10%: %hdGh%" EXIT /b REM ::::::::::::::::::::::: ::::::::::::::::::::::::::: ::::::::::::::::::::::::::: :get_file_size Set #FileSize=0 IF NOT exist %1 EXIT /b for /f %%h in ('Echo.%1') do Set #FileSize=%%~zh exit /b 0 REM ::::::::::::::::::::::: ::::::::::::::::::::::::::: ::::::::::::::::::::::::::: REM ::: Формируем список переменных .1 .2 .3 .4 .5 и т.д. REM ::: со значениями в виде строк БЕЗ КАВЫЧЕК :create_.NN Set #NAME=%~1 if "%~1"=="" exit /b set .%#N:~-2%=%#NAME% set /a #N=%#N% + 1 exit /b 0 rem :::::::::::::::::: ::::::::::::::::: ::::::::::::::: :choice_select REM ::: Подготовительные действия set #Choice= set /A #N=101 REM ::: Проверим наличие подготовленного списка set /a .entries=1 FOR /F "delims== tokens=1,2" %%i in ('Set . ^| find "=" /C ') do Set /a .entries=%%i REM ::: Если .entries=1, то списка нет (оформим сообщение об этом) IF '%.entries%'=='1' ( FOR /L %%s in (1,1,5) do Echo.# : ^| Echo "Списка выбора НЕ СУЩЕСТВУЕТ!!!" goto :EXIT_E ) REM ::: Сюда попадаем ТОЛЬКО при наличии списка REM ::: Сохраним количество элементов списка и удалим из него .entries set /a #entries=%.entries% - 1 set .entries= REM ::: Отформатированный вывод команды Set = СПИСОК ВЫБОРА FOR /F "delims== tokens=1,2" %%i in ('Set .') do Echo.# : %%i %%j Echo # :--^| Для выхода - '0'... :qu REM ::: Запрос на выбор номера set #User_Select=0 set /P #User_Select="# :--| Введите номер выбора : " REM ::: Анализ ответа (0 - ВЫХОД) set #Choice=%#User_Select% REM ::: Допишем кавычки, если их не было IF NOT '%#User_Select:~0,1%%#User_Select:~-1,1%'=='""' Set #User_Select="%#User_Select%" set #F=0 IF %#User_Select%=="0" ( set #Choice= echo.#--------------------------- Echo.#=^> Прервано... goto :EXIT_E ) REM ::: Если не выход, то среди переменных среды .1,.2,.3,.4, и т.д. будем искать имя соответствующее выбору FOR /F "tokens=1,* delims==" %%i in ('Set .') do CALL:take_sel %%i "%%j" if '%#F%'=='0' Echo.# :--^| Выбор "%#Choice%" не указан: & goto :qu echo.#-------------------------- set #C#=%#Choice% :ltrim set #D#=%#C#% set #C#=%#C#: = % if NOT %#D#%==%#C#% goto:ltrim set #C#=%#C#:"=% Echo.#=^>Ваш выбор:%#Choice:~0,66% :EXIT_E exit /b 0 REM ::::::::::::::::::::::: ::::::::::::::::::::::::::: ::::::::::::::::::::::::::: :take_sel if NOT '%1'=='.%#Choice%' exit /b 0 Set #Choice=%2 Set #F=1 exit /b 0 rem :::::::::::::::::: ::::::::::::::::: ::::::::::::::: :ghost_name setlocal EnableExtensions EnableDelayedExpansion ListUsbDrives.exe -a >#ListAllDrives.log REM ::: РАЗБИВКА #ListAllDrives.log ПО БУКВАМ Set #z#=** Set #device=-& Set #partition=- for /f "tokens=1,2 delims==" %%a in ('more +5 #ListAllDrives.log' ) do ( Set #aa=%%a Set #bb=%%b if "!#aa!"=="MountPoint " ( Set #z#=!#bb:~1,3! ) else ( if :!#z#!:==:%1: ( if "!#aa!"=="Partition Name " Set #device=!#bb:~17,2!>nul&Set #device=!#device:\=!>nul&Set /a #device=!#device!+1>nul if "!#aa!"=="Partition Number " Set /a #partition=!#bb!>nul 2>nul ) ) ) set #Choice=!#device!:!#partition! endlocal &set %2=%#Choice% exit /b rem :::::::::::::::::: ::::::::::::::::: ::::::::::::::: :dialog for /f "usebackq delims=" %%Q in (`@mshta "about:
" ^|MORE`) do set %1="%%Q"&REM exit /b