Показать полную графическую версию : [решено] Подсчет количества файлов, вывод суммы, минимального и максимального номера файла
Alexander_88
08-07-2019, 04:39
Здравствуйте, не давно создавал тему по подсчету файлов http://forum.oszone.net/thread-341211.html
Нужен еще один вариант вывода для некоторых путей.. необходимо указать не только количество и сумму, но еще минимальный и максимальный номер файла.
Пример:
Я задаю в скрипте два пути и имена файлов (по маске).
C:\\test\*start*.*
C:\\krug\*aist*.*
Папки с файлами:
test
0054ajsdhglsdhlg.mp4
0349dfsgdgsd.avi
0673start.avi
1673start.wmv
krug
aist0005.mp3
kran.mp3
aist0024.mp3
В результате, скрипт выводит на экран пути, минимальный и максимальный номер файла, а также количество найденных файлов, а в самом низу сумму всех таких файлов
C:\\test\0673 - 1673 start - 2
C:\\krug\0005 - 0024 aist - 2
4
Известно:
номер всегда четырехзначный
для одного пути номер будет либо в начале, либо в конце, т.е. если мы указали путь C:\\test\*start*.*, то по этому пути будут присутствовать другие файлы, а также файлы типа NNNNstart или startNNNN (только один какой - то вариант). Кстати, для каждого пути, мы всегда знаем где эти номера будут располагаться (в начале или конце), поэтому при необходимости мы всегда можем помечать это в скрипте :)
megaloman
08-07-2019, 12:24
@Echo Off
cls
Set /A N=0
Call :NFiles "Z:\Soft_In\start\????start.*" "[0-9][0-9][0-9][0-9]start\..*" "N" "M1"
Call :NFiles "Z:\Soft_In\start\start????.*" "start[0-9][0-9][0-9][0-9]\..*" "N" "M2"
Call :NFiles "Z:\Soft_In\start\start1????.*" "start1[0-9][0-9][0-9][0-9]\..*" "N" "M3"
Echo %N%
Pause
Exit /B
:NFiles
SetLocal
Set /A N=0
Set "M1="
Set "MN="
FOR /F "usebackq delims=" %%a IN (`2^>nul Dir %1 /B /O:N /A:-D ^|findstr /I /R /C:"^%~2"`) DO (
Call Set /A N+=1
If Not Defined M1 Call Set "M1=%%a"
Call Set "MN=%%a"
)
If %N%==0 (Set "M1=%~nx1" &Set "MN=%~nx1")
Echo %1 - %M1% -^> %MN% = %N%
EndLocal &(Set /A %~3+=%N%) &(Set %~4=%1 - %M1% -^^^> %MN% = %N%)
Exit /B@Echo Off
cls
Set /A N=0
Call :NFiles "Z:\Soft_In\start\????start.*" "[0-9][0-9][0-9][0-9]start\..*" 4 "N" "M1"
Call :NFiles "Z:\Soft_In\start\start????.*" "start[0-9][0-9][0-9][0-9]\..*" 4 "N" "M2"
Call :NFiles "Z:\Soft_In\start\stagrt????.*" "stagrt[0-9][0-9][0-9][0-9]\..*" 4 "N" "M3"
Echo %N%
Pause
Exit /B
:NFiles
SetLocal
Set /A N=0
Set "Reg=%~2"
If "%Reg:~0,5%"=="[0-9]" (Set /A Reg=1) Else (Set /A Reg=2)
Set "M1="
Set "MN="
FOR /F "usebackq delims=" %%a IN (`2^>nul Dir %1 /B /O:N /A:-D ^|findstr /I /R /C:"^%~2"`) DO (
Call Set /A N+=1
If Not Defined M1 Call Set "M1=%%~na"
Call Set "MN=%%~na"
)
If %N%==0 (Set "M1=%~n1" &Set "MN=%~n1")
If %Reg%==1 (Call Set "M1=%%M1:~0,%3%%") Else (Call Set "M1=%%M1:~-%3%%")
If %Reg%==1 (Call Set "MN=%%MN:~0,%3%%") Else (Call Set "MN=%%MN:~-%3%%")
Echo %1 - %M1% -^> %MN% = %N%
EndLocal &(Set /A %~4+=%N%) &(Set %~5=%1 - %M1% -^^^> %MN% = %N%)
Exit /B@Echo Off
cls
Set /A N=0
Call :NFiles "Z:\Soft_In\start\????start.*" "[0-9][0-9][0-9][0-9]start\..*" 4 "N" "M1"
Call :NFiles "Z:\Soft_In\start\start????.*" "start[0-9][0-9][0-9][0-9]\..*" 4 "N" "M2"
Call :NFiles "Z:\Soft_In\start\st22art????.*" "st22art[0-9][0-9][0-9][0-9]\..*" 4 "N" "M3"
Echo %N%
Pause
Exit /B
:NFiles
SetLocal
Set /A N=0
Set "Reg=%~2"
If "%Reg:~0,5%"=="[0-9]" (Set /A Reg=1) Else (Set /A Reg=2)
Set "M1="
Set "MN="
FOR /F "usebackq delims=" %%a IN (`2^>nul Dir %1 /B /O:N /A:-D ^|findstr /I /R /C:"^%~2"`) DO (
Call Set /A N+=1
If Not Defined M1 Call Set "M1=%%~na"
Call Set "MN=%%~na"
)
If %N%==0 (Set "M1=%~n1" &Set "MN=%~n1")
If %Reg%==1 (
Call Set "NM1=%%M1:~%3%%"
Call Set "M1=%%M1:~0,%3%%"
Call Set "MN=%%MN:~0,%3%%"
) Else (
Call Set "NM1=%%M1:~0,-%3%%"
Call Set "M1=%%M1:~-%3%%"
Call Set "MN=%%MN:~-%3%%"
)
Echo %~dp1%M1% - %MN% %NM1% %N%
EndLocal &(Set /A %~4+=%N%) &(Set %~5=%~dp1%M1% - %MN% %NM1% %N%)
Exit /BВарианты отличаются способом представления выходной информации. Третий - как у Вас.
Alexander_88
10-07-2019, 01:17
Спасибо, все три варианта запустил, выбрал один :)
А не подскажите, что такое "M1" "M2" "M3" ? Я везде сделал "M1", вроде как все нормально работает, или нужно обязательно поменять цифры?
megaloman
10-07-2019, 07:16
Alexander_88, в переменных "M1" "M2" "M3" сообщения для каждого пути. По началу я хотел сделать вывод всех сообщений после вызова всех процедур, например:
Echo %M1%
Echo %M2%
Echo %M3%
Echo %N%
Но потом сделал вызов сообщений внутри процедуры, а эти переменные оставил про запас.
Естественно, если Вы везде указываете имя одной и той же переменной, например, M1, то сохранится только одно значение для последнего вызова процедуры.
Не обязательно имя переменной писать "M1" "M2" "M3", можно, например,"start" "aist" и т д. и затем
Echo %start%
Echo %aist%
либо Echo %start% %aist%
при этом Echo в процедуре можно убрать.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.