Показать полную графическую версию : [решено] Вывести 2 самых свежих файла по указаному пути
All!@nce
07-07-2020, 14:26
Здравствуйте. Знатоки подскажите пожалуйста как решить такую задачу. Есть папка в которую каждый день падает по одному архиву. Нужно вывести имена двух самых свежих архивов (по дате создания или изменения), а также их размеры (желательно в КБ).
Пробовал вот таким образом но почему то не работает. Выводит все файлы...
@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
Спасибо!
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
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
iglezz, супер, просто то что нужно! Подскажите еще пожалуйста как поправить чтобы размер в КБ выводился
megaloman
07-07-2020, 16:35
All!@nce, А какой максимальный размер файлов?
All!@nce
07-07-2020, 16:49
All!@nce, А какой максимальный размер файлов? »
До 20 ГБ
Сейчас у меня выводит вот так:
размер 3606707190
Надо так:
размер 3 606 707 КВ
megaloman
07-07-2020, 17:01
All!@nce, Формально надо размер/1024. Но для CMD есть ограничение в 214748364.
Насколько критичен вывод именно в килобайтах. В тысячах байт не устроит?
В принципе, есть способ выкрутиться ....
All!@nce
07-07-2020, 17:05
В тысячах байт не устроит? »
Вполне устроит. Надо видеть примерную разницу в этих файлах.
Надо просто откинуть 3 последние цифры. Ну и разделить на группы по 3 знака (это в идеале)
Формально надо размер/1024. »
нет, у топикстатера обозначение KB, а не KiB
All!@nce
07-07-2020, 17:36
KB, а не KiB »
Подойдет любой вариант. Мне лишь надо видеть примерную разницу в размерах файлов. А на поделится эта цифра на 1024 или просто откинется 3 символа мне абсолютно не важно.
All!@nce, @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
@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
Супер. Спасибо большое, вы мне очень помогли!
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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.