¿Por qué el comando forfiles enumera archivos que no tienen un día de antigüedad a pesar de que el comando sea lo contrario?

¿Por qué el comando forfiles enumera archivos que no tienen un día de antigüedad a pesar de que el comando sea lo contrario?

El comando que estoy ejecutando esforfiles -p"C:\testdata" -m*.* -d-1 -c"cmd /c echo @PATH\@FILE"

He especificado que deseo enumerar solo los archivos que tienen un día de antigüedad; sin embargo, cuando ejecuto la declaración, me devuelve una lista de los archivos que se crearon hoy.

¿Porqué es eso? ¿Estoy haciendo algo mal? ¿Sería mejor especificar un período de tiempo en lugar de una fecha, por ejemplo, 24 horas?

La versión de forfiles que tengo dice lo siguiente . El archivo por lotes se ejecuta en Windows XP.FORFILES v 1.1 - [email protected] - 4/98

Respuesta1

ForfilesLa versión que utiliza no es el comando nativo de XP. Es una versión anterior de la utilidad, que se distribuyó originalmente con uno de W2K Resource Kits(creo que incluso llega al kit de recursos NT, aunque no estoy seguro). No hay nada de malo en usar eso en XP per se, pero si observas de cerca su sintaxis, dice (el énfasis es mío):

-d[+|-][DDMMAA|DD] Seleccionar archivos con fecha >= o <=DDMMAA(UTC) o archivos con fecha >= o <= (fecha actual - días DD)

NotaUTCen la descripción. Esto significa (1.1) forfilesque utiliza marcas de tiempo diferentes a las que usted cree, a menos que la hora de su sistema sea UTC (sin compensación), no hay horario de verano.
Probablemente esto será más fácil con un ejemplo. Soy UTC+1, horario de verano.
(fecha de hoy - 2012-09-19)

  • Crea un archivo y haz un directorio:

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

tiene la fecha de hoy, por lo que no debe ser seleccionado por forfiles, comprobemos:

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

¡Pero sí es seleccionado! ¿Por qué? Veamos las horas UTC del archivo (el siguiente comando se ejecuta desde PowerShell):

ls .\zzz_utc.txt |select LastAccessTime,LastAccessTimeUTC

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

Como se puede ver,HoraUtc- ¡El que usó (1.1) forfileses de ayer! Es por eso que la herramienta lo selecciona.

Respuesta2

"... Deseo enumerar sólo los archivos que tienen un día de antigüedad ..."

¿Te refieres a "archivos que se crearon ayer"? Es decir, (hoy es 18 de septiembre), archivos cuya fecha/hora de modificación es ≥ 0000 (medianoche de la madrugada del) 17 de septiembre y ≤ 2359,60 (medianoche del final de) 17 de septiembre. Bueno, son dos fechas/ restricciones de tiempo y forfilesno le permite especificar más de una. En pocas palabras: creo que eso forfilesno logrará eso.

... Sin embargo, cuando pruebo /d -1mi equipo con Windows 7, obtengo archivos que se crearon ayer o antes. Entonces, tal vez la versión de Windows XP forfilesesté rota.

Respuesta3

Desde elbuena documentacion(el énfasis es mío):

Selecciona archivos con una fecha de última modificación posterior o igual a (+) la fecha actual más el número de días especificado, o anterior o igual a (-) la fecha actualmenos el número de días especificados.

Editar:

Quizás podrías probar con un 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

Respuesta4

Parece que FORFILES /D -1 tiene un error incluso en Windows 8 y Windows Server 2008 R2 (no puedo hacerlo funcionar - selecciona todos los archivos - en un sistema con fechas griegas)

Puede analizar % fecha% como se sugiere en algún comentario anterior, pero tenga en cuenta que en Windows 8, por ejemplo, la fecha muestra 3 letras con el nombre del día y un espacio primero, luego el formato de fecha clásico. Además, esa fecha estará en formato localizado, mientras que FORFILES /D espera una fecha en formato dd/MM/aaaa según forfiles /? (al menos en Win8).

CORRECCIÓN: parece haber un malentendido (por mí y por otros también a juzgar por una búsqueda en la red) sobre lo que hace /D -dd, parece que no busca archivos que tengan dd días de antigüedad, sino que tengan más de dd días

por lo que necesita usar la sintaxis /D +dd/MM/yyyy de FORFILES y pasar la fecha de ayer allí para encontrar todos los archivos con fecha mayor que ayer. Para automatizar esto, puede usar %date% y analizarlo con %date:~7,2%/%date:~4,2%/%date:~-4% o algo así (puede que sea necesario reordenar las partes de la fecha allí dependiendo de su localidad)

información relacionada