Пакетный файл для удаления файлов старше N дней

Он отбрасывается в булеан. Любая непустая строка оценивает значение true.

Из Спецификация языка ECMAScript :

12.5 Оператор if

Семантика

Произведение IfStatement : if ( Выражение ) Statement else Statement оценивается следующим образом:

  1. Пусть exprRef является результатом оценки выражения .
  2. Если ToBoolean (GetValue ( exprRef )) истинно, затем возвращает результат оценки первого Statement .
  3. Else, Вернуть результат оценки второго Statement .

9.2 ToBoolean

Абстрактная операция ToBoolean преобразует свой аргумент в значение типа Boolean в соответствии с таблицей 11:

Таблица 11 - Конверсии ToBoolean

Undefined: false Null: false Boolean: результат равен входному аргументу (без преобразования). Number: Результат равен false, если аргумент равен +0, -0 или NaN; иначе результат будет правдой. String: результат является ложным, если аргумент является пустой строкой (ее длина равна нулю); иначе результат будет правдой. Object: true

blockquote>

Что касается оператора ==, это сложно, но суть в том, что, если вы сравниваете число с не номером, последнее преобразуется в число. Если вы сравниваете логическое значение с небулевым, логическое значение сначала преобразуется в число, а затем применяется предыдущее предложение.

Подробности см. В разделе 11.9.3.

// Call this x == y.
if ("string" == true) 

// Rule 6: If Type(y) is Boolean,
//         return the result of the comparison x == ToNumber(y).
if ("string" == Number(true))

// Rule 5: If Type(x) is String and Type(y) is Number,
//         return the result of the comparison ToNumber(x) == y.  
if (Number("string") == Number(true))

// The above is equivalent to:
if (NaN == 1)

// And NaN compared to *anything* is false, so the end result is:
if (false)

639
задан Stephan 16 March 2018 в 15:40
поделиться

5 ответов

Наслаждайтесь:

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path"

См. forfile документация для получения дополнительной информации.

Для большего количества положительных героев, обратитесь к Индекс A-Z командной строки .

Windows XP, Если Вы не имеете forfiles установленный на Вашей машине, скопируйте его с любого Windows Server 2003 к Вашему Windows  машина XP в %WinDir%\system32\. Это возможно, так как EXE полностью совместим между Windows Server 2003 и Windows  XP.

Более поздним версиям Windows Server и Windows Server установили его по умолчанию.

Для Windows  7 и более новый (включая окна 10):

синтаксис изменился немного. Поэтому обновленная команда:

forfiles /p "C:\what\ever" /s /m *.* /D -<number of days> /C "cmd /c del @path"
1008
ответ дан bzamfir 16 March 2018 в 15:40
поделиться

Вы могли бы быть в состоянии осуществить это. Можно смотреть на этот вопрос для более простого примера. Сложность прибывает, когда Вы начинаете сравнивать даты. Может быть легко сказать, больше ли дата или нет, но существует много ситуаций, чтобы рассмотреть, необходимо ли на самом деле получить различие между двумя датами.

, Другими словами - не пытаются изобрести это, если Вы действительно не можете использовать сторонние инструменты.

3
ответ дан Community 16 March 2018 в 15:40
поделиться

Посмотрите мой ответ на аналогичный вопрос :

REM del_old.bat
REM usage: del_old MM-DD-YYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT
for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa"

При этом удаляются файлы старше указанной даты. Я уверен, что его можно изменить, чтобы вернуться на семь дней назад с текущей даты.

update: Я заметил, что HerbCSO улучшил вышеуказанный сценарий. Я рекомендую вместо этого использовать его версию .

17
ответ дан 22 November 2019 в 21:47
поделиться

Ок, мне немного скучно, и он придумал это, которое содержит мою версию замены эпохи Linux для бедняков, ограниченную для ежедневного использования (без сохранения времени):

7daysclean.cmd

@echo off
setlocal ENABLEDELAYEDEXPANSION
set day=86400
set /a year=day*365
set /a strip=day*7
set dSource=C:\temp

call :epoch %date%
set /a slice=epoch-strip

for /f "delims=" %%f in ('dir /a-d-h-s /b /s %dSource%') do (
    call :epoch %%~tf
    if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
)
exit /b 0

rem Args[1]: Year-Month-Day
:epoch
    setlocal ENABLEDELAYEDEXPANSION
    for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f
    if "!Months:~0,1!"=="0" set Months=!Months:~1,1!
    if "!Days:~0,1!"=="0" set Days=!Days:~1,1!
    set /a Days=Days*day
    set /a _months=0
    set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1)
    set /a Months=!_months!
    set /a Years=(Years-1970)*year
    set /a Epoch=Years+Months+Days
    endlocal& set Epoch=%Epoch%
    exit /b 0

ИСПОЛЬЗОВАНИЕ

set / a strip = day * 7 : Измените 7 количество дней для хранения.

set dSource = C: \ temp : Это начальный каталог для проверки файлов.

ПРИМЕЧАНИЯ

Это неразрушающий код, он покажет, что могло бы произойти.

Измените:

if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)

на что-то вроде:

if !epoch! LEQ %slice% del /f %%f

, чтобы файлы действительно удалялись

Февраль : жестко задано 28 дней. Биссекстильные годы - это ад, правда. Если у кого-то есть идея, что не нужно добавлять 10 строк кода, продолжайте и опубликуйте, поэтому я добавляю ее в свой код.

эпоха : я не учел время, поскольку необходимо удалить файлы старше определенной даты, если взять часы / минуты, файлы будут удалены за день, который был предназначен для хранения.

ОГРАНИЧЕНИЕ

эпоха принимает как должное, ваш краткий формат даты - ГГГГ -ММ-ДД. Его нужно будет адаптировать для других настроек или оценки времени выполнения (прочтите sShortTime, привязанную к пользователю конфигурацию, настройте правильный порядок полей в фильтре и используйте фильтр для извлечения правильных данных из аргумента).

упомянуть, я ненавижу автоматическое форматирование этого редактора? он удаляет пустые строки, и копипаст - это ад.

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

Его нужно будет адаптировать для других настроек или оценки времени выполнения (прочтите sShortTime, привязанную к пользователю конфигурацию, настройте правильный порядок полей в фильтре и используйте фильтр для извлечения правильных данных из аргумента).

упомянуть, я ненавижу автоматическое форматирование этого редактора? он удаляет пустые строки, и копипаст - это ад.

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

Его необходимо будет адаптировать для других настроек или оценки времени выполнения (прочтите sShortTime, конфигурацию с привязкой к пользователю, настройте правильный порядок полей в фильтре и используйте фильтр для извлечения правильных данных из аргумента).

упомянуть, я ненавижу автоматическое форматирование этого редактора? он удаляет пустые строки, и копипаст - это ад.

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

24
ответ дан 22 November 2019 в 21:47
поделиться

Как насчет этой модификации 7daysclean.cmd , учитывающей високосный год?

Это можно сделать менее чем за 10 строк кода!

set /a Leap=0
if (Month GEQ 2 and ((Years%4 EQL 0 and Years%100 NEQ 0) or Years%400 EQL 0)) set /a Leap=day
set /a Months=!_months!+Leap

Править Mofi:

Вышеупомянутое условие внесено J.R. всегда оценивается как false из-за недопустимого синтаксиса.

И Месяц GEQ 2 также неверен, потому что добавление 86400 секунд для еще одного дня нужно делать в високосном году только для месяцев с марта по декабрь, но не для февраля.

Рабочий код для учета високосных дней - только в текущем году - в пакетном файле 7daysclean.cmd , опубликованном Джеем , будет выглядеть следующим образом:

set "LeapDaySecs=0"
if %Month% LEQ 2 goto CalcMonths
set /a "LeapRule=Years%%4"
if %LeapRule% NEQ 0 goto CalcMonths
rem The other 2 rules can be ignored up to year 2100.
set /A "LeapDaySecs=day"
:CalcMonths
set /a Months=!_months!+LeapDaySecs
6
ответ дан 22 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: