1

Я выполняю forfiles -p"C:\testdata" -m*.* -d-1 -c"cmd /c echo @PATH\@FILE"

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

Это почему? Я делаю что-то неправильно? Было бы лучше указать период времени, а не дату, например, 24 часа?

Версия файлов, которую я читал, читается следующим образом: FORFILES v 1.1 - emmanubo@microsoft.com - 4/98 . Пакетный файл запускается в Windows XP.

4 ответа4

1

Из прекрасной документации (выделение мое):

Выбирает файлы с последней измененной датой, которая больше или равна (+) текущей даты плюс число указанных дней, или раньше или равна (-) текущей дате минус указанное количество дней.

Редактировать:

Возможно, вы могли бы попробовать с VBScript:

Set args = WScript.Arguments.Named
Set fso  = CreateObject("Scripting.FileSystemObject")

d = 0
p = "."

If args.Exists("?") Or args.Count = 0 Then
  WScript.Echo "Usage: cscript " & WScript.ScriptName & " [/d:DAYS] [/p:PATH]"
  WScript.Quit(0)
End If

If args.Exists("d") Then d = args("d")
If args.Exists("p") Then p = args("p")

refDate = DateAdd("d", d, Now)
TraverseFolders fso.GetFolder(p)

Sub TraverseFolders(fldr)
  For Each f In fldr.Subfolders
    TraverseFolders(f)
  Next
  For Each f In fldr.Files
    If f.DateLastModified < refDate Then
      WScript.StdOut.WriteLine f.Path
      'f.Delete
    End If
  Next
End Sub
1

»... Я хочу перечислить только файлы, которые являются однодневными ... »

Вы имеете в виду "файлы, которые были созданы вчера"?  То есть (сегодня это 18 сентября), файлы с датой / временем изменения ≥ 0000 (полночь ранним утром) 17 сентября и ≤ 2359.60 (полночь в конце) 17 сентября.  Ну, это два ограничения даты / времени, и forfiles не позволяет вам указать более одного.  Итог: я считаю, что forfiles этого не сделает.

...  Однако, когда я пытаюсь /d -1 на моем Windows 7, я получаю файлы, которые были созданы вчера или раньше.  Поэтому, возможно, версия forfiles Windows XP не работает .

1

Forfiles версия файлов не является командой XP. Это более старая версия утилиты, которая изначально распространялась вместе с одним из W2K Resource Kits (я думаю, что это относится даже к NT Resource Kit, хотя я не уверен). Нет ничего плохого в том, чтобы использовать это в XP как таковой, но если вы внимательно посмотрите на его синтаксис, он говорит (выделение мое):

-d [+| -] [DDMMYY | DD] Выбрать файлы с датой> = или <= DDMMYY (UTC) или файлы с датой> = или <= (текущая дата - ДД дней)

Обратите внимание на UTC в описании. Это означает, что (1.1) forfiles использует разные временные метки, которые, как вы думаете, используются - если только ваше системное время не указано в формате UTC (без смещения), нет перехода на летнее время.
Это будет, вероятно, проще с примером. Я UTC+1, летнее время.
(сегодняшняя дата - 2012-09-19)

  • Создать файл и сделать каталог:

2012-09-19 00:14 5 zzz_utc.txt

у него есть сегодняшняя дата, поэтому он не должен быть выбран forfiles, давайте проверим его:

FORFILES -pc:\temp -mzzz_utc.* -d-1 -c"CMD /C Echo @FILE"
zzz_utc.txt

Но это выбирается! Зачем? Давайте посмотрим на время файла UTC (следующая команда запускается из powershell):

ls .\zzz_utc.txt |select LastAccessTime,LastAccessTimeUTC

LastAccessTime                          LastAccessTimeUtc
--------------                          -----------------
2012-09-19 00:15:11                     2012-09-18 22:15:11

Как видите, TimeUtc - тот, который используется в (1.1) forfiles , со вчерашнего дня! Вот почему он выбирается инструментом.

0

Кажется, что FORFILES /D -1 имеет ошибку даже в Windows 8 и Windows Server 2008 R2 (не может заставить его работать - выбирает все файлы - в системе с греческими датами)

Вы можете проанализировать% date%, как предложено в некотором комментарии выше, но обратите внимание, что в Windows 8, например, дата показывает сначала 3 буквы с названием дня и пробелом, а затем классический формат даты. Также эта дата будет в локализованном формате, тогда как FORFILES /D ожидает дату в формате dd /MM /yyyy в соответствии с forfiles /? (по крайней мере на Win8).

ИСПРАВЛЕНИЕ: кажется, что существует недоразумение (я и другие тоже, судя по поиску в сети) о том, что делает /D -dd, кажется, что он не ищет файлы, которые имеют возраст dd дней, но старше чем dd дней

поэтому вам нужно использовать /D +dd /MM / гггг синтаксиса FORFILES и передать туда вчерашнюю дату, чтобы найти все файлы с датой больше, чем вчера. Чтобы автоматизировать это, вы можете использовать% date% и проанализировать его с% date:~ 7,2% /% date:~ 4,2% /% date:~ -4% или что-то в этом роде (может потребоваться изменить порядок частей даты там в зависимости от вашей локали)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .