Elimina archivos < 15 dias problema con rutas por espacios

Iniciado por lemuhr, 22 Agosto 2014, 23:55 PM

0 Miembros y 1 Visitante están viendo este tema.

lemuhr

Hola, les agradezco su ayuda con un script que encontré en la red con el cual puedo eliminar archivos inferiores a 15 días de creado, en mi caso, pero al hacer la revisión en la estructura de carpetas no encuentra la ruta si hay espacios, he creado el archivo que crea el mismo script con comillas, pero no lee las lineas con comillas, y tampoco con espacios.
este es el script:

Código (vb) [Seleccionar]
set objshell = createobject("wscript.shell")
objshell.run "cmd /c dir d:\PUBLIC /s /b> templist.txt",vbhide
wscript.sleep 2000
'listamos los archivos por línea de comandos, y guardamos el listado en un archivo temporal
'luego hacemos una pausa de dos segs para que se cree correctamente el archivo

set objfso = createobject("scripting.filesystemobject")
set temp = objfso.opentextfile("templist.txt",1)
'abrimos el archivo temporal
do until temp.atendofstream
fi = temp.readline
'leemos cada una de las líneas del archivo
if objfso.fileexists(fi) = true then
if objfso.getfile(fi).parentfolder.name <> Registros then
'si existe el archivo (para evitar que sea una carpeta) y la carpeta en la que esta es diferente de Registros
if datediff("d",objfso.getfile(fi).datecreated,now()) >= 15 then
'objfso.deletefile(objfso.getfile(fi).path)
'revisamos la fecha y si tiene más de 15 dias (tomando en cuenta la fecha de hoy), lo borramos
end if
end if
end if
loop
temp.close
'cerramos el archivo temporal


Ah, tampoco se a que se refieren con Registros ...

Saludos,

Eleкtro

#1
Antes de nada debo decir que ese script no es de buena calidad, la persona que lo escribió no tuvo los suficientes conocimientos ya que se basa en la utilización de un lenguaje inferior (Batch) y hace otras cosas innecesarias como la pausa de 2 segundos.




Citarno encuentra la ruta si hay espacios

Las rutas con espacios deben encerrarse con comillas dobles: "C:\Ruta con espacios", bueno, en realidad TODO argumento debería encerrarse con las comillas dobles lleve espacios o no para no caer en malas practicas de uso, pero el caracter de la comila doble (") es un caracter reservado por el lenguaje VBS y se debe escapar, la manera de escaparla es duplicando el caracter ("").

CitarAh, tampoco se a que se refieren con Registros ...
Ni idea, es una variable que no está definida en el código, así que se tomará como un valor vacio:

Esto:
if objfso.getfile(fi).parentfolder.name <> Registros then...

Es lo mismo que:
If "Esto" es distinto a NADA then...
(Es decir, siempre dará positivo)

De todas formas al parecer la intención que tuvo con esa variable "desaparecida" es determinar si el archivo es realmente un archivo y no una carpeta, es algo innecesario porque puedes especificar la exclusión de carpetas en el comando de Batch.

Nota: Para evitar ese tipo de problemas con variables utiliza la declaración Option Explicit




El código corregido:

Código (vb) [Seleccionar]
Option Explicit
Dim Shell, FSO, FileList, File ' Objetos
Dim Directory, OutputFile      ' Variables

Set Shell   = CreateObject( "WScript.Shell" )
Set FSO     = createobject( "scripting.filesystemobject" )

Directory   = """" & "C:\users" & """"
OutputFile  = """" & shell.ExpandEnvironmentStrings( "%TEMP%\" ) & "templist.txt" & """"

' CMD.exe /C "Dir /B /S /A-D "Directorio" > "Archivo""
Shell.run "CMD.exe /C ""DIR /B /S /A-D " & Directory & " > " & OutputFile & """", 0, 1

Set FileList = FSO.opentextfile(Replace(OutputFile, """", ""), 1)

'abrimos el archivo temporal
Do Until FileList.AtEndOfStream

'leemos la siguiente linea del archivo
Set File = FSO.GetFile(FileList.ReadLine)

'revisamos la fecha y si tiene más de 15 dias (tomando en cuenta la fecha de hoy) entonces...
If DateDiff("d", File.DateCreated,now()) > 15 Then

'eliminamos el archivo.
'FSO.DeleteFile(File.Path)

End If

Loop

FileList.close ' Liberamos el objeto.


PD: Te recomiendo hacer una copia de seguridad del directorio antes de eliminar archivos, para comprobar que esté todo bien, pude tener algún fallo.

PD2: Como ya te expliqué el código no es de buena calidad, se puede obtener los archivos de forma recursiva utilizando VBS, lo cual es más eficiente, pero también requiere bastante más código, no se lo añadí por si eso te iba a confundir, pero en esta url tienes un ejemplo.

Saludos!








nanoakb

podrias hacer uno asi pero que en lugar de eliminar archivos de 15 dias elimine archivos que no estan en la lista? para asi eliminar nuevos que se vayan generando

Eleкtro

#3
Hola.

Como poder, podría hacerlo, pero es bastante desagradable invertir tiempo en el desarrollo de un código para no recibir ni un miserable "gracias", esto obviamente no lo digo por ti, sino por el usuario al que iba dirigido el código de arriba.

Aparte, no es solo por eso, sino que además no veo que hayas mostrado ningún código donde lo hayas intentado hacer por ti mismo, ten en cuenta que aquí no estamos para regalar las tareas ya hechas a nadie, sino para ayudar en los obstáculos para que al final puedas lograr el objetivo por ti mismo.

De todas formas, creeme lo siguiente que te voy a decir, es una completa pérdida de tiempo llevarlo a cabo en una herramienta tan limitada como Batch, hacerlo supone muchas trabas (y pereza) por tiempo invertido y tediosas limitaciones, y conseguirlo supone muchas fisuras que no se pueden controlar correctamente en caso de posible error de cualquier tipo debido a las limitaciones del lenguaje una vez mas.

En cualquier otro lenguaje podrías elaborar un sofisticado algoritmo de búsqueda de archivos, filtrado por fechas y exclusión en 5-10 minutos (bueno, más tiempo si no tienes conocimientos previos de dicho lenguaje), no pierdas el tiempo con Batch ni pidiendo que te regalen el código...

Saludos.








nanoakb

#4
tenes razon lo siento, y el motivo por que pareciera que no lo intente es justamente porque soy un ignorante por eso preguntaba.
si tuvieras que recomendarme un lenguaje cual seria? aver si me pongo en ello

Eleкtro

#5
Cita de: nanoakb en 12 Mayo 2016, 15:08 PMsi tuvieras que recomendarme un lenguaje cual seria? aver si me pongo en ello

Para este tipo de tareas, algo sencillo a la vez que efectivo sería Visual Basic.NET (no confundir con VB6 ni VBS) o C#, en ambos lo harías de la misma manera pero utilizando una sintaxis distinta.

Con la función System.IO.Directory.GetFiles() puedes obtener los archivos, y de manera recursiva (o no).
Con las propiedades del type System.IO.FileInfo puedes obtener la fecha de creación, modificación o último acceso de un archivo.
Para la exclusión, una manera sencilla sería con una query de LINQ-to-objects (From fi As FileInfo In files Where Not (fi.CreationTime < DateTime.Today.AddDays(-15)), así de simple en una sola linea).

PD: Hasta para alguien que jamás haya tocado esos lenguajes creo que es muy sencillo si buscas ejemplos de los nombres que he mencionado en Google y lo intentas hacer, en serio.

Saludos!








nanoakb

bueno gracias
vere que puedo hacer con c# aver que me sale,seguramente volvere jamas los eh tocado pero tampoco me rindo facilmente