
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
Forfiles
La 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) forfiles
que 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) forfiles
es 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 forfiles
no le permite especificar más de una. En pocas palabras: creo que eso forfiles
no logrará eso.
... Sin embargo, cuando pruebo /d -1
mi equipo con Windows 7, obtengo archivos que se crearon ayer o antes. Entonces, tal vez la versión de Windows XP forfiles
esté 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)