GORA2
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору wolf0425 Начну с благодарности Вам и не сердитесь я только учусь. Показалось, что я довольно подробно изложил задачу, привел пример файл-списка, указал путь, который мне нужен из данного файл-списка, но... оказалось, что только показалось . Вот развернутая постановка задачи. На панели ТС выделены файл(ы) и/или папка(и). Пути с именами выделенных объектов передаются в батник с помощью файл-списка. Цитата: D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath\ D:\DISTRIBUT 1\7-Zip\1_7zSD_test\Realtek AC97 Audio Drivers v5.10.00.5970\ D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath 07.05.16 11-35.res D:\DISTRIBUT 1\7-Zip\1_7zSD_test\Archive 07.05.15 15-32.7z D:\DISTRIBUT 1\7-Zip\1_7zSD_test\0test 07.05.15 13-18.7z D:\DISTRIBUT 1\7-Zip\1_7zSD_test\archiVE.7z | Файл список в кодировке win1251. Все выделенные объекты могут даходиться только в одной папке (В данном примере это D:\DISTRIBUT 1\7-Zip\1_7zSD_test\) или в корне диска (например, D:\) Записей в файл-списке может быть от 1 до N. Путь к файл-списку передается в батник в переменной ~1. Задача: 1. Переменная soursepart долна содержать имя_и_путь_папки в которой находятся выделенные объекты (в данном примере это D:\DISTRIBUT 1\7-Zip\1_7zSD_test\) или D:\ , если объекты расположены в корне диска D. 2. Переменная soursename долна содержать: а) если в списке одна запись и она является папкой, то имя_этой_папки (в данном примере это InstallPath, если эта запись состоит из D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath\) б) если в списке одна запись и она является файлом, то имя_этого_файла без расширения (в данном примере это InstallPath 07.05.16 11-35, если эта запись состоит из D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath 07.05.16 11-35.res) в) если в списке больше чем одна запись, то имя_папки уровнем выше (в данном примере это 1_7zSD_test). Если объекты расположены в корне диска, то имя фиксированное - Archive 3 Переменная allfile долна содержать общее число файлов (только файлов без папок) в файл-списке. Диапазон от 0 до 4, остальные файлы, если их больше, не интересут. 4 Переменнные var1, var2, var3, var4 долны содержать имя_и_путь_фаила для первых четырех файлов в файл-списке, остальные файлы, если их больше, не интересут. Сейчас я решаю эту задачу так Код: @echo off setlocal enabledelayedexpansion CHCP 1251>nul set allfile=0& set flagmany=0& FOR /F "tokens=*" %%i IN (%1) DO ( set "tempi=%%i" & IF NOT "!tempi:~-1!"=="\" ( set /a allfile+=1 & set "var!allfile!=%%i" & set "soursename=%%~ni" & set "soursepart=%%~dpi" ) ELSE ( set /a flagmany+=1 & FOR /D %%a IN ("!tempi:~0,-1!.txt") DO (set "soursename=%%~na" & set "soursepart=%%~dpa") ) ) set /a flagmany+=allfile & IF !flagmany! GTR 1 ( IF "!soursepart:~-2!"==":\" (set "soursename=Archive") ELSE (FOR /D %%a IN ("!soursepart:~0,-1!.txt") DO (set "soursename=%%~na")) ) CHCP 866>nul echo %soursepart% echo %soursename% IF %allfile% GTR 4 set allfile=4 call :_normlvars "%var1%" "%var2%" "%var3%" "%var4%" EXIT | Дальнейшая обработка полученных переменных происходит в _normlvars. Все остальные переменные (не перечисленные мной ранее) являются временными. Можно ли оптимизировать этот код с целью уменьшения и ускорения работы? Выход по достижению 4 файлов я не сделал - не "дотянул" пока. А здесь есть возможность сократить время работы при большем количестве файлов. Заранее спасибо всем откликнувшимся. |