Вот пакетный код для вашей задачи:
@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 из меню Помощь в разделы справки и откройте вкладку Содержание пункт Режим линии Команда и подпозиция переключатели.
'FOR %% f IN (%% G) DO' скобки являются обязательными. – Stephan
Вы не можете рассчитывать с помощью Даты в CMD. Вы должны конвертировать Даты в номера раньше. (или использовать внешние инструменты, которые могут) – Stephan
вы можете найти полезные ссылки с [функцией поиска] (http://stackoverflow.com/search?q =% 5Bbatch-file% 5D + расчет + дата + время + секунды) – Stephan