Как проверить создание метки времени для файла в пакетном скрипте Windows? - PullRequest
4 голосов
/ 27 июля 2011

Мне нужна помощь, как проверить файлы в определенных папках с отметкой времени старше 2 дней, после чего удалить или удалить или скопировать в другое место?

Ответы [ 3 ]

3 голосов
/ 27 июля 2011

Простой цикл FOR с командой SET с использованием модификатора ~t возвращает дату последнего изменения файлов в каталоге.

См. Этот пример

@echo off
setlocal enabledelayedexpansion
echo Files changed today %date%
FOR %%A IN (*.*) DO (
  set tf=%%~tA
  set fd=!tf:~0,10!
  if !fd!==%date% (
    echo  %%F !tf! 
  )
)

Подробнее см. HELP FOR и HELP SET.

Но для сравнения дат, выходящих за рамки простого сравнения, показанного выше, необходимо извлечь каждый компонент даты

set dd=!tf:~0,2!
set mm=!tf:~3,2!
set yyyy=!tf:~6,4!

Но, подождите, извлечение компонентов даты из BAT-файла - очень сложная проблема, потому что %DATE% и модификатор ~t форматируют дату, используя краткий формат, который полностью (бесконечно) настраивается. Один пользователь может настроить свою систему так, чтобы она возвращала Fri040811, а другой пользователь может выбрать 08/04/2011. Это полный кошмар для программиста на BAT.

Одним из возможных решений является временное изменение формата. Смотрите этот пример.

@echo off
echo System Date Time = %date% %time%
reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f >nul
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyyy-MM-dd" /f >nul
reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH:mm:ss" /f >nul
echo Normalized Date Time = %date% %time%
set dd=%date:~8,2%
set mm=%date:~5,2%
set yyyy=%date:~0,4%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f >nul

И, наконец, вы должны выполнить арифметику с датами, вам нужно преобразовать дату в ДД ММ ГГГГ в количество дней, что также не очевидно. Вот код для этого преобразования.

:days
:: Algorithm based on Fliegel-Van Flandern algorithm from the Astronomical Almanac,
:: provided by Doctor Fenton on the Math Forum (http://mathforum.org/library/drmath/view/51907.html),
:: and converted to batch code by Ron Bakowski.
SET /A Month1 = ( 1%MM% %% 100 - 14 ) / 12
SET /A Year1  = %YYYY% + 4800
SET /A days = 1461 * ( %Year1% + %Month1% ) / 4 + 367 * ( (1%MM% %% 100) - 2 -12 * %Month1% ) / 12 - ( 3 * ( ( %Year1% + %Month1% + 100 ) / 100 ) ) / 4 + (1%DD% %% 100) - 32075
SET Month1=
SET Year1=
goto :eof

странная идиома (1%MM% %% 100) используется для исправления проблемы с тем, как SET /A интерпретирует восьмеричные числа, начинающиеся с нуля.

Итак, собрав все эти части вместе ...

@echo off
setlocal enabledelayedexpansion enableextensions

reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f >nul
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyyy-MM-dd" /f >nul
reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH:mm:ss" /f >nul

set dd=%date:~8,2%
set mm=%date:~5,2%
set yyyy=%date:~0,4%
call :days
set /a today=!days!

FOR %%A IN (*.*) DO (
  set tf=%%~tA
  set fd=!tf:~0,10!
  set dd=!fd:~8,2!
  set mm=!fd:~5,2!
  set yyyy=!fd:~0,4!
  call :days
  set /a age= !today!-!days!
  if !age! leq 2 (
    echo  %%A is !age! days old
  )
)
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f >nul
goto :eof

:days
:: Algorithm based on Fliegel-Van Flandern algorithm from the Astronomical Almanac,
:: provided by Doctor Fenton on the Math Forum (http://mathforum.org/library/drmath/view/51907.html),
:: and converted to batch code by Ron Bakowski.
SET /A Month1 = ( 1%MM% %% 100 - 14 ) / 12
SET /A Year1  = %YYYY% + 4800
SET /A days = 1461 * ( %Year1% + %Month1% ) / 4 + 367 * ( (1%MM% %% 100) - 2 -12 * %Month1% ) / 12 - ( 3 * ( ( %Year1% + %Month1% + 100 ) / 100 ) ) / 4 + (1%DD% %% 100) - 32075
SET Month1=
SET Year1=
goto :eof
0 голосов
/ 10 июня 2015

здесь указано, как вы можете удалять файлы старше 2 дней

следующая команда на cmd сделает это.

forfiles  /p "c:\path" /s /m *.* /d -365 /c "cmd /c del @file"
0 голосов
/ 27 июля 2011

Не уверен насчет удаления, но вы можете использовать RoboCopy (который является частью Windows 7). Параметр: / MAXAGE: n будет копировать файлы старше n - обычно я делаю копию в папку резервных копий, а позже я «удаляю» все из этого каталога, как только я уверен.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...