Компьютерный форум 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=348604)

NickTeilor 22-04-2021 12:17 2956232

Скрипт для проверки файлов по размеру и по времени
 
Добрый день, совсем не разбираюсь в написании скриптов, по этому прошу помощи

Как реализовать процесс проверки фалов по размеру. Если размер файла составляет меньше 500mb, после окончания проверки выводить сообщение с цифрой 0 если больше то с 1
и так же со временем, если время изменения файла больше 24 часов то выводить сообщение 0, если меньше то 1
Заранее спасибо за ответы, буду очень благодарен если напишите пояснение. Хочу разобраться в этой теме.

DJ Mogarych 22-04-2021 12:52 2956234

Powershell
Код:

$file = Get-Item "D:\temp\file.txt"
if ($file.length -lt 500MB) {"0"} else {"1"}
if ($file.LastWriteTime -lt (get-date).AddDays(-1)) {"0"} else {"1"}


NickTeilor 22-04-2021 13:01 2956236

DJ Mogarych,

Спасибо, а подскажите, реально это сделать средствами cmd ?

DJ Mogarych 22-04-2021 13:06 2956237

Наверняка, я просто не владею cmd за ненадобностью.
Может, коллеги подскажут.

megaloman 22-04-2021 16:37 2956247

Цитата:

Цитата NickTeilor
Если размер файла составляет меньше 500mb, после окончания проверки выводить сообщение с цифрой 0 если больше то с 1 »

Если размер тестируемого файла не более 2'147'483'647 байт, то
Код:

@Echo Off
cls
        Set "FileIn=Z:\Box_In\1 Высокий блондин в черном ботинке (1972).mp4"
        Set /A mSize=500*1024*1024

        Call :fSize %mSize% "%FileIn%" "Index"       

Echo %Index%
pause
Exit /B

:fSize
SetLocal
        Set /A i=2
        If Exist %2 Pushd "%~dp2" && (
                Set /A i=1
                For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%~2"`) Do If %%~zf LSS %1 Set /A i=0
                Popd
        )       
EndLocal &Set /A %~3=%i%
Exit /B


alpap 22-04-2021 16:49 2956249

Код:

@echo off
set "pDir=C:\Папка"
set "file=Файл.ext"

call :# "%file%"
pause& exit

:#
  Pushd "%pDir%"
    set /a Szmb=%~z1/1024
    if %Szmb% lss 500 (echo 0) else (echo 1)
    2>nul forfiles /M "%~nx1" /D -1 && (echo 0) || (echo 1)
  Popd
exit /b

но,
Цитата:

Цитата NickTeilor
больше 24 часов »

это будет не точно - "на глазок", чтобы сделать удобнее и точнее придется задействовать PowerShell и смысл тогда это делать, если весь код проще на нем сделать что и показано выше у DJ Mogarych

megaloman 22-04-2021 17:14 2956253

Цитата:

Цитата alpap
set /a Szmb=%~z1/1024 »

Если 500 это mb, то, ИМХО
Код:

set /a Szmb=%~z1/1024/1024
???
Спасибо Alpap, я перемудрил, в моём варианте можно обойтись без For и, кроме того, без Push (файлы не более 2'147'483'647 байт
Код:

@Echo Off
cls
        Set "FileIn=Z:\Box_In\1 Высокий блондин в черном ботинке (1972).mp4"
        Set /A mSize=500*1024*1024

        Call :fSize %mSize% "%FileIn%" "Index"       

Echo %Index%
pause
Exit /B

:fSize
If Not Exist %2 (Set /A %~3=2 &Exit /B 2)
SetLocal
        If %~z2 LSS %1 (Set /A i=0) Else (Set /A i=1)
EndLocal &Set /A %~3=%i%
Exit /B

Слегка усложнить код, файлы могут быть в 1 000 000 раз больше
Код:

@Echo Off
cls
        Set "FileIn=Z:\Box_In\1 Высокий блондин в черном ботинке (1972).mp4"
        Set /A mSize=500*1024*1024

        Call :fSize %mSize% "%FileIn%" "Index"       

Echo %Index%
pause
Exit /B

:fSize
        If Not Exist %2 (Set /A %~3=2 &Exit /B 2)
        SetLocal
                Set "A2=%~z2"
                Call Set "A2=%%A2:~0,-6%%"

                Set /A A1=%1
                Set "A1=%A1:~0,-6%"
                If "%A1%"=="" Set /A A1=0
                If "%A2%"=="" Set /A A2=0
                Set /A i=1
                IF Not "%A2%"=="0" If %A2% LSS %A1% Set /A i=0
        EndLocal &Set /A %~3=%i%
Exit /B

Что касается времени, причём не обязательно для 24 часов, то корректно в CMD это сделать можно наверное, но будет громоздко. Как вариант (если CMD принципиален и Powershell никак не применять), можно сделать CMD со встроенным JS

megaloman 22-04-2021 23:12 2956271

Как вариант (если CMD принципиален и Powershell никак не применять), можно сделать CMD со встроенным JS
Код:

@set @E=1; /*

@Echo Off
cls
        Set "FileIn=Z:\Box_In\1 Высокий блондин в черном ботинке (1972).mp4"
        Set /A dtFile=24*60*60
        Set /A dsFile=500*1024*1024
       
        For /f "usebackq tokens=1,2 delims= " %%a In (`Cscript //NoLogo /E:jscript "%~dpnx0" "%FileIn:\=\\%" %dsFile% %dtFile%`) Do (
                Set /A lSize=%%a
                Set /A lTime=%%b
        )

        Echo "%lSize%"  "%lTime%"
pause
GoTo :Eof
*/

var oArg = WScript.Arguments;
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
var now = new Date();

var gFile = FSO.GetFile(oArg(0));

//                WScript.Echo(gFile.Size + " < " + oArg(1));
var lSize;
if (gFile.Size < oArg(1)) lSize = 0; else lSize = 1;

//                WScript.Echo(now.getTime()/1000 - gFile.DateLastModified/1000 + " < " + oArg(2));
var lTime;
if (now.getTime()/1000 - gFile.DateLastModified/1000 < oArg(2)) lTime = 0; else lTime = 1;

WScript.Echo(lSize, lTime);

Время задавать в секундах, размер в байтах, батник сохранить в 866 кодировке.

NickTeilor 23-04-2021 05:11 2956274

Огромное вам спасибо, пойду разбирать по полочкам и переваривать информацию )


Время: 14:49.

Время: 14:49.
© OSzone.net 2001-