| GORA2 
 
  
 Advanced Member
 | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору wolf0425
 Начну с благодарности Вам и не сердитесь я только учусь. Показалось, что я довольно подробно изложил задачу, привел пример файл-списка, указал путь, который мне нужен из данного файл-списка, но... оказалось, что только показалось
  . Вот развернутая постановка задачи.
 На панели ТС выделены файл(ы) и/или папка(и). Пути с именами выделенных объектов передаются в батник с помощью файл-списка.
 Цитата:
 Файл список в кодировке win1251. Все выделенные объекты могут даходиться только в одной папке (В данном примере это D:\DISTRIBUT 1\7-Zip\1_7zSD_test\) или в корне диска (например, D:\) Записей в файл-списке может быть от 1 до N. Путь к файл-списку передается в батник в переменной ~1.| 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
 | 
 Задача:
 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 долны содержать имя_и_путь_фаила для первых четырех файлов в файл-списке, остальные файлы, если их больше, не интересут.
 
 Сейчас я решаю эту задачу так
 Код:
 Дальнейшая обработка полученных переменных происходит в _normlvars. Все остальные переменные (не перечисленные мной ранее) являются временными.| @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
 | 
 Можно ли оптимизировать этот код с целью уменьшения и ускорения работы? Выход по достижению 4 файлов я не сделал - не "дотянул" пока. А здесь есть возможность сократить время работы при большем количестве файлов.
 Заранее спасибо всем откликнувшимся.
 
 |