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

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

All!@nce 07-07-2020 14:26 2927565

Вывести 2 самых свежих файла по указаному пути
 
Здравствуйте. Знатоки подскажите пожалуйста как решить такую задачу. Есть папка в которую каждый день падает по одному архиву. Нужно вывести имена двух самых свежих архивов (по дате создания или изменения), а также их размеры (желательно в КБ).

Пробовал вот таким образом но почему то не работает. Выводит все файлы...
Код:

@echo off
chcp 1251 >nul

pushd "\\comp1\arh"

set num=0
for /f "delims=" %%i in ('dir /b/a-d/o-d/tw') do (
echo Файл %%i изменён %%~ti размер %%~zi
set /a num+=1
if num==2 goto NEXT )
popd

:NEXT

pause

Спасибо!

iglezz 07-07-2020 15:13 2927567

All!@nce,
1. Выводит все файлы, т.к. в условии "if num==2" сравниваются литералы "num" и "2", которые никогда не смогут быть равными.
2. Командой "setlocal enabledelayedexpansion" необходимо установить раскрытие переменных в момент выполнения кода, а не в момент чтения кода интерпретатором. Тогда будет работать счётчик.
3. popd в вышеприведённом коде сработает только если файлов в целевом каталоге будет меньше двух.
итоговый результат
Код:

@echo off
chcp 1251 >nul
setlocal enabledelayedexpansion

pushd "\\comp1\arh"

set num=0
for /f "delims=" %%i in ('dir /b/a-d/o-d/tw') do (
echo Файл %%i изменён %%~ti размер %%~zi
set /a num+=1
if !num!==2 goto NEXT
)

:NEXT

popd
pause
endlocal


megaloman 07-07-2020 15:38 2927568

All!@nce,
Для произвольного числа выводимых файлов
Код:

@Echo Off
cls
>nul Chcp 1251

        Set "BoxIn=\\Server\Test1"
        Set "Mask=*.*"
        Set /A N=2

        Set /A i=%N%
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:-D /T:W`) DO (
                Call :OutPut "%BoxIn%\%%f" ||GoTo :End)
        )
        :End
pause
Exit /B

:OutPut
        Set "Name=                                            %~nx1"
        Echo Файл %Name:~-25% изменён %~t1 размер %~z1
        Set /A i-=1
        If %i%==0 Exit /B 1
Exit /B 0

Я попытался выровнять как-то имена файлов по длине для лучшей наглядности. Если этого не надо, замените 2 красные строки одной
Код:

        Echo Файл %~nx1 изменён %~t1 размер %~z1
Только для двух файлов
Код:

@Echo Off
cls
>nul Chcp 1251

        Set "BoxIn=\\Server\Test1"
        Set "Mask=*.*"

        Set "Файл1="
        Set "Файл2="
        Pushd "%BoxIn%" && (
                FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%Mask%" /B /A:-D /O:D /T:W`) DO (
                        Call Set "Файл1=%%Файл2%%"
                        Set "Файл2=                                    %%f"
                        Call Set "Файл2=%%Файл2:~-25%% изменён %%~tf размер %%~zf"
                )
                Popd
        )
        Set Файл
pause
Exit /B

Еще вариант для сравнительно произвольного числа в произвольном порядке
Код:

@Echo Off
cls
>nul Chcp 1251

        Set "BoxIn=\\Server\Test1"
        Set "Mask=*.*"

        Set /A i=0
        Pushd "%BoxIn%" && (
                FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%Mask%" /B /A:-D /O:-D /T:W`) DO (
                        Set /A i+=1
                        Set "Name=                                      %%f"
                        Call Set "Файл%%i%%=%%Name:~-25%% изменён %%~tf размер %%~zf"
                )
                Popd
        )
        Echo Файл %Файл3%
        Echo Файл %Файл2%
        Echo Файл %Файл1%
pause
Exit /B


All!@nce 07-07-2020 16:24 2927575

iglezz, супер, просто то что нужно! Подскажите еще пожалуйста как поправить чтобы размер в КБ выводился

megaloman 07-07-2020 16:35 2927577

All!@nce, А какой максимальный размер файлов?

All!@nce 07-07-2020 16:49 2927579

Цитата:

Цитата megaloman
All!@nce, А какой максимальный размер файлов? »

До 20 ГБ
Сейчас у меня выводит вот так:
Код:

размер 3606707190
Надо так:
Код:

размер 3 606 707 КВ

megaloman 07-07-2020 17:01 2927580

All!@nce, Формально надо размер/1024. Но для CMD есть ограничение в 214748364.
Насколько критичен вывод именно в килобайтах. В тысячах байт не устроит?
В принципе, есть способ выкрутиться ....

All!@nce 07-07-2020 17:05 2927581

Цитата:

Цитата megaloman
В тысячах байт не устроит? »

Вполне устроит. Надо видеть примерную разницу в этих файлах.
Надо просто откинуть 3 последние цифры. Ну и разделить на группы по 3 знака (это в идеале)

Busla 07-07-2020 17:29 2927584

Цитата:

Цитата megaloman
Формально надо размер/1024. »

нет, у топикстатера обозначение KB, а не KiB

All!@nce 07-07-2020 17:36 2927585

Цитата:

Цитата Busla
KB, а не KiB »

Подойдет любой вариант. Мне лишь надо видеть примерную разницу в размерах файлов. А на поделится эта цифра на 1024 или просто откинется 3 символа мне абсолютно не важно.

iglezz 07-07-2020 17:48 2927586

All!@nce,
Отформатировать примерный размер в KB можно таким способом
Код:

@echo off
chcp 1251 >nul
setlocal enabledelayedexpansion

pushd "\\comp1\arh"

set num=0
for /f "delims=" %%i in ('dir /b/a-d/o-d/tw') do (
call :FormatSize %%~zi
echo Файл %%i изменён %%~ti размер ~!_formattedSize! KB
set /a num+=1
if !num!==2 goto NEXT
)

:NEXT

popd
pause
endlocal
exit /b


:FormatSize
setlocal
set in=%~1
set "formattedSize=%in:~-15,-12% %in:~-12,-9% %in:~-9,-6% %in:~-6,-3%"
for /f "tokens=*" %%_ in ("%formattedSize%") do set formattedSize=%%_
endlocal & set _formattedSize=%formattedSize%
exit /b 0


megaloman 07-07-2020 18:02 2927587

В тыс.байтов c выделением разрядов
Код:

@Echo Off
cls
>nul Chcp 1251

        Set "BoxIn=\\Server\Test1\Мой контент\Музыка\Шевчук"
        Set "Mask=*.*"
        Set /A N=4

        Set /A i=%N%
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:-D /T:W`) DO (
                Call :OutPut "%BoxIn%\%%f" ||GoTo :End)
        )
        :End
pause
Exit /B

:OutPut
        Set "Size=    %~z1"
        Set "Size=%Size:~0,-3%"

        Set "OutSize="
        :Begin
                Set "S=%Size:~-3%"
                If "%S%"=="  " GoTo :Continue
                Set "Size=%Size:~0,-3%"
                Set "OutSize=%S: =%'%OutSize%"
                GoTo :Begin
        :Continue
        If "%OutSize%"=="" Set "OutSize=00"
       

        Echo Файл %~nx1 изменён %~t1 размер %OutSize:~0,-1%тыс.б
        Set /A i-=1
        If %i%==0 Exit /B 1
Exit /B 0


All!@nce 07-07-2020 18:22 2927590

Супер. Спасибо большое, вы мне очень помогли!

Fors1k 07-07-2020 19:25 2927594

All!@nce, вот одна команда для вашей задачи(powershell), и выводите себе результат хоть в ТБ, хоть в миллиардах байт.

Код:

param(
    $path = "C:\Архивы",
    $unit = 'KB'
)cls

gci $path -file|sort LastWriteTime -des|select name, length -first 2|ft -a -h name, @{Expression={"{0:### ### ###.00}" -f($_.length/"1$unit")+" $unit"}}

Ответ:
Код:

Архив Ёлочка.rar  ⁣⁣⁣1 811 310 KB
Архив Ромашка.rar 1 533 218 KB



Время: 15:24.

Время: 15:24.
© OSzone.net 2001-