2015-12-29 2 views
1

Я уже здесь написал для этой проблемы, мы решили ее, но теперь я должен добавить это «если файл был создан за последние 24 часа, то это еще не ». Я нашел несколько примеров в Интернете, но я просто не могу понять синтаксис Command. Я бы действительно apreciate некоторую помощь с этим ... вот сайт я нашел:Код партии, если дата создания меньше, чем 24 часа

https://github.com/npocmaka/batch.scripts/blob/master/fileUtils/fileModifiedTime.bat

и здесь не мой код:

ECHO OFF 
set ReadFolder1="C:\Users\ugrum\Desktop\new"  
set Destination="C:\Users\ugrum\Desktop\Zacasnamapa" 
set sevenZipDir="C:\Program Files\7-Zip\7zG.exe" 
set currentDate=%date% 

IF NOT EXIST %Destination% MKDIR %Destination% 

FOR /R %ReadFolder1% %%G IN (*_NOT*) DO (
    ECHO %%G 
    FOR %%f IN %%G DO SET filedatetime=%%~tf 
    IF %currentDate% - %filedatetime:~0, 10% <= 24  
    XCOPY "%%G" %Destination% /C 
) 

%sevenZipDir% a -tzip neustrezne.zip %Destination% 
RMDIR /Q /S %Destination% 

PAUSE 

Я знаю, что if неправильно, но у меня нет подумайте, как правильно это сделать.

+1

'FOR %% f IN (%% G) DO' скобки являются обязательными. – Stephan

+1

Вы не можете рассчитывать с помощью Даты в CMD. Вы должны конвертировать Даты в номера раньше. (или использовать внешние инструменты, которые могут) – Stephan

+0

вы можете найти полезные ссылки с [функцией поиска] (http://stackoverflow.com/search?q =% 5Bbatch-file% 5D + расчет + дата + время + секунды) – Stephan

ответ

3

Вот пакетный код для вашей задачи:

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
set "ReadFolder1=%USERPROFILE%\Desktop\new" 
set "Destination=%USERPROFILE%\Desktop\Zacasnamapa" 
set "SevenZipApp=%ProgramFiles%\7-Zip\7zG.exe" 

if not exist "%Destination%" mkdir "%Destination%" 

rem Get seconds since 1970-01-01 for current date and time. 
rem From date string only the last 10 characters are passed to GetSeconds 
rem which results in passing dd/mm/yyyy or dd.mm.yyyy in expected format 
rem to this subroutine independent on date string of environment variable 
rem DATE is with or without abbreviated weekday at beginning. 
call :GetSeconds "%DATE:~-10% %TIME%" 

rem Subtract seconds for 24 hours (24 * 3600 seconds) from seconds value. 
set /A "CompareTime=Seconds-24*3600" 

for /R "%ReadFolder1%" %%G in (*_NOT*) do (
    echo %%G 
    for %%F in ("%%G") do (
     call :GetSeconds "%%~tF:0" 
     if !Seconds! GTR %CompareTime% (
      echo Copy file %%G 
      xcopy "%%G" "%Destination%\" /C /I /M /Q /R /Y >nul 
     ) 
    ) 
) 

"%SevenZipApp%" a -tzip neustrezne.zip "%Destination%" 
rmdir /Q /S "%Destination%" 

endlocal 
goto :EOF 


rem No validation is made for best performance. So make sure that date 
rem and hour in string is in a format supported by the code below like 
rem MM/DD/YYYY hh:mm:ss or M/D/YYYY h:m:s for English US date/time. 

:GetSeconds 

rem If there is " AM" or " PM" in time string because of using 12 hour 
rem time format, remove those 2 strings and in case of " PM" remember 
rem that 12 hours must be added to the hour depending on hour value. 
set "DateTime=%~1" 
set "Add12Hours=0" 
if "%DateTime: AM=%" NEQ "%DateTime%" (
    set "DateTime=%DateTime: AM=%" 
) else if "%DateTime: PM=%" NEQ "%DateTime%" (
    set "DateTime=%DateTime: PM=%" 
    set "Add12Hours=1" 
) 

rem Get year, month, day, hour, minute and second from first parameter. 
for /F "tokens=1-6 delims=,-./: " %%A in ("%DateTime%") do (
    rem For English US date MM/DD/YYYY or M/D/YYYY 
    rem set "Day=%%B" & set "Month=%%A" & set "Year=%%C" 
    rem For German date DD.MM.YYYY or English UK date DD/MM/YYYY 
    set "Day=%%A" & set "Month=%%B" & set "Year=%%C" 
    set "Hour=%%D" & set "Minute=%%E" & set "Second=%%F" 
) 

rem Remove leading zeros from the date/time values or calculation could be wrong. 
if "%Month:~0,1%" EQU "0" (if "%Month:~1%" NEQ "" set "Month=%Month:~1%" ) 
if "%Day:~0,1%" EQU "0" (if "%Day:~1%" NEQ "" set "Day=%Day:~1%"  ) 
if "%Hour:~0,1%" EQU "0" (if "%Hour:~1%" NEQ "" set "Hour=%Hour:~1%" ) 
if "%Minute:~0,1%" EQU "0" (if "%Minute:~1%" NEQ "" set "Minute=%Minute:~1%") 
if "%Second:~0,1%" EQU "0" (if "%Second:~1%" NEQ "" set "Second=%Second:~1%") 

rem Add 12 hours for time range 01:00:00 PM to 11:59:59 PM, 
rem but keep the hour as is for 12:00:00 PM to 12:59:59 PM. 
if "%Add12Hours%" == "1" (
    if %Hour% LSS 12 set /A Hour+=12 
) 
set "DateTime=" 
set "Add12Hours=" 

rem Must use 2 arrays as more than 31 tokens are not supported 
rem by command line interpreter cmd.exe respectively command FOR. 
set /A "Index1=Year-1979" 
set /A "Index2=Index1-30" 

if %Index1% LEQ 30 (
    rem Get number of days to year for the years 1980 to 2009. 
    for /F "tokens=%Index1% delims= " %%Y in ("3652 4018 4383 4748 5113 5479 5844 6209 6574 6940 7305 7670 8035 8401 8766 9131 9496 9862 10227 10592 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245") do set "Days=%%Y" 
    for /F "tokens=%Index1% delims= " %%L in ("Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N") do set "LeapYear=%%L" 
) else (
    rem Get number of days to year for the years 2010 to 2038. 
    for /F "tokens=%Index2% delims= " %%Y in ("14610 14975 15340 15706 16071 16436 16801 17167 17532 17897 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550 21915 22280 22645 23011 23376 23741 24106 24472 24837") do set "Days=%%Y" 
    for /F "tokens=%Index2% delims= " %%L in ("N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N") do set "LeapYear=%%L" 
) 

rem Add the days to month in year. 
if "%LeapYear%" == "N" (
    for /F "tokens=%Month% delims= " %%M in ("0 31 59 90 120 151 181 212 243 273 304 334") do set /A "Days+=%%M" 
) else (
    for /F "tokens=%Month% delims= " %%M in ("0 31 60 91 121 152 182 213 244 274 305 335") do set /A "Days+=%%M" 
) 

rem Add the complete days in month of year. 
set /A "Days+=Day-1" 

rem Calculate the seconds which is easy now. 
set /A "Seconds=Days*86400+Hour*3600+Minute*60+Second" 

rem Exit this subroutine 
goto :EOF 

Для получения подробной информации о методе используются для сравнения времени читать мои ответы на

Примечание 1:

Формат даты и времени, возвращаемый %DATE:~-10% %TIME% и %%~tF:0, зависит от настроек региона Windows и языка. Код, как написано ожидает строки даты dd/mm/yyyy или dd.mm.yyyy или dd-mm-yyyy и времени строки hh:mm:ss с или без ведущих нулей в случае час, минуту или секунду меньше, чем 10.

Сокращенный день недели на начало строки даты окружающей среды переменная DATE не имеет значения из-за использования только последних 10 символов, если строка даты имеет начальный ноль для дня или месяца менее 10, поскольку она является стандартной для Windows.

Для формата даты США mm/dd/yyyy команда rem должна быть перемещена из одной строки в другую в подпрограмме GetSeconds, как поясняется в пояснении.

Примечание 2:

Смотрите мой ответ на set environment variables with spaces по той причине, используя set "variable=value with spaces" и опорного значение variable, заключенное в двойных кавычках, в случае необходимости, вместо того, чтобы использовать set variable="value with spaces", которые могут привести к неправильному коду на выполнении.

Кстати:

ли Вы когда-либо думали потратить несколько долларов на покупку лицензии на WinRAR в качестве задачи, чтобы сжать все файлы, измененные в течение последних 24 часов может быть сделано с WinRAR с одной командной строкой или с использованием графического интерфейса пользователя WinRAR? Подумайте о времени, которое вы и мы потратили на то, чтобы написать пакетный код для этой очень простой задачи, используя WinRAR и сравнить его с небольшими деньгами на одну лицензию . Стоимость WinRAR.

командной строки с помощью WinRAR будет:

%ProgramFiles%\WinRAR\WinRAR.exe a -ac -afzip -cfg- -ep -ibck -m5 -tn24h -y "%USERPROFILE%\Desktop\neustrezne.zip" "%USERPROFILE%\Desktop\new\*_NOT*" 
  • является команда, которая означает добавить в архив.

  • -ac - это переключатель для очистки атрибута архива для каждого файла, добавленного в архив. Здесь это не обязательно, но очень полезно.

  • -afzip явно сообщает WinRAR для создания ZIP-архива. Этот переключатель действительно не нужен здесь, так как имя архивного файла заканчивается .zip и поэтому WinRAR будет автоматически использовать ZIP вместо RAR компрессия.

  • -cfg- отключает стандартную конфигурацию для создания архивов. Всегда рекомендуется использовать этот переключатель при использовании WinRAR из периодического файла, периодически выполняемого для создания архива независимо от настроек, не определенных в командной строке.

  • -ep приводит к добавлению файлов без указания пути к архиву.

  • -ibck сообщает WinRAR для запуска минимизируется до системного лотка в качестве фонового приложения. Но при использовании опций диалоговое окно отображается, если возникает ошибка при добавлении файлов в архив.

  • -m5 использование лучший компрессия.

  • -tn24h это хороший вариант WinRAR имеет который 7-Zip в настоящее время не нужно добавлять только файлы, соответствующие шаблону в указанном каталоге изменение в течение последних 24 часов, то есть более новый, чем текущая дата/время минус 24 часов.

  • -y принять да по всем запросам пользователя.

Для получения более подробной информации о WinRAR переключатели открыты в WinRAR из меню Помощь в разделы справки и откройте вкладку Содержание пункт Режим линии Команда и подпозиция переключатели.

+0

Чтобы добавить ответ Mofi, если вы можете использовать PowerShell, ваш скрипт может быть более читабельным и поддерживаемым. Кроме того, если ваше требование 24h является гибким и действительно находится на границе дня, вы можете использовать robocopy и/MAXAGE для получения файлов. –

Смежные вопросы