Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Подсчет количества файлов, вывод суммы, минимального и максимального номера файла (http://forum.oszone.net/showthread.php?t=341215)

Alexander_88 08-07-2019 04:39 2878711

Подсчет количества файлов, вывод суммы, минимального и максимального номера файла
 
Здравствуйте, не давно создавал тему по подсчету файлов 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 2878747

CMD1
Код:

@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

CMD2
Код:

@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

CMD3
Код:

@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 2879084

Спасибо, все три варианта запустил, выбрал один :)
А не подскажите, что такое "M1" "M2" "M3" ? Я везде сделал "M1", вроде как все нормально работает, или нужно обязательно поменять цифры?

megaloman 10-07-2019 07:16 2879100

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 в процедуре можно убрать.


Время: 16:55.

Время: 16:55.
© OSzone.net 2001-