Quitar este error en batch

Iniciado por The Last Hero, 26 Marzo 2011, 15:02 PM

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

The Last Hero

#10
Esta vez si ha salido  ;-) ¿que estaba haciendo mal?Y siento haberlo modificado, pero como bien sabes el que no modifica cosas no aprende xD o por lo menos eso decia cuando empece con batch hace un año y medio  :xD

Ahora me salta otra duda, como la que tuvimos en el otro post, en el caso de que se detecten¿como los imprimo en el bloc de notas? osea serian dos partes, una en las que lo detecta y los imprime, y la otra parte la de tu codigo que lo elimina si existe. Es que el codigo para imprimirlo no se si cambiaria al poner ese otro codigo debajo.¿tu que opinas?¿el codigo seria el mismo o uno parecido?porque creo que si hago el del FOR dira que tambien hay un error que no se detecta -_- por cierto,¿a este codigo que me has puesto puedo ponerle los atributos para que los archivos ocultos se muestren y luego eliminarlos?

Osea, que para que este bien tengo que separarlos con el ; y ponerlos alineados.

Bueno un saludo, tengo la esperanza de que este sea lo ultimo que te hago escribir, porque para haber dado hace tiempo batch,solo me acuerdo hasta las sentencias if y for -_-

EDITO:Parece no borrar los archivos, le he añadido uno que esta en el escritorio como bloc de notas y no lo borra...
Gracias de nuevo pitoloko eres un crack  ::)

SuperDraco

Pero no decias que para este script no querias usar el bloc de notas ni archivos por separado? xDDDDDDD

EDITO: El script borra archivos ocultos incluido.


Código (dos) [Seleccionar]
@echo off
setlocal enabledelayedexpansion
Set Token=

Echo /Arcihvos encontrados: > Archivo.txt
echo+ >> Archivo.txt


for /f "tokens=1,2,3,4,5,6,7,8,9 delims=;" %%a in ('"echo %Temp%\archivo.exe;%Windir%\archivo1.exe;%Windir%\archivo2.dll;%Windir%\archivo2.exe;%Windir%\Temp\archivo1.tmp;%Windir%\archivo3.exe;"') do (
  Set Token=%%a
  call :Comprobar
  Set Token=%%b
  call :Comprobar
  Set Token=%%c
  call :Comprobar
  Set Token=%%d
  call :Comprobar
)

Goto :END





:Comprobar
IF exist %TOKEN% (
  Del !TOKEN! \f \q \i \s >NUL 2>&1
  Echo !TOKEN! Se ha eliminado.
  Echo !TOKEN! >> Archivo.txt
  goto:eof
) ELSE (
     Echo !TOKEN! No se ha encontrado.
     Echo !TOKEN! >> Archivo2.txt
     goto:eof
)






:END
cls
echo+ >> Archivo.txt
Echo /Arcihvos no encontrados: >> Archivo.txt
echo+ >> Archivo.txt
copy Archivo.txt+Archivo2.txt >NUL 2>&1
Del /Q Archivo2.txt >NUL 2>&1
Type Archivo.txt
PAUSE >nul





(A mi si que me ha borrado Archivo1.exe de c:\windows :/)
Resultado:

/Arcihvos encontrados:

C:\Windows\archivo1.exe

/Arcihvos no encontrados:

C:\Users\PiToLoKo\AppData\Local\Temp\archivo.exe
C:\Windows\archivo2.dll
C:\Windows\archivo2.exe
Presione una tecla para continuar . . .

No he vuelto, solo estoy de paso.

The Last Hero

Lo del bloc de notas, es que tu anterior post pensaba que era cargar las rutas en un archivo.txt,que leyera las lineas y empezara a eliminar, pero no que no creara un repote, de todas maneras perdona fue fallo mio  :-\ En cuanto a tu codigo, puse un archivo1.exe en windows, y si lo elimino, pero si creo un archivo.txt en el escritorio no lo elimina pero sale en no detectados  :o Te pego el codigo:

Citar@echo off
setlocal enabledelayedexpansion
Set Token=

Echo /Arcihvos encontrados: > Archivo.txt
echo+ >> Archivo.txt


for /f "tokens=1,2,3,4,5,6,7,8,9 delims=;" %%a in ('"echo %userprofile%\Escritorio\detectalo.txt;%Temp%\archivo.exe;%Windir%\archivo1.exe;%Windir%\archivo2.dll;%Windir%\archivo2.exe;%Windir%\Temp\archivo1.tmp;%Windir%\archivo3.exe;"') do (
   Set Token=%%a
   call :Comprobar
   Set Token=%%b
   call :Comprobar
   Set Token=%%c
   call :Comprobar
   Set Token=%%d
   call :Comprobar
)

Goto :END





:Comprobar
IF exist %TOKEN% (
   Del !TOKEN! \f \q \i \s >NUL 2>&1
   Echo !TOKEN! Se ha eliminado.
   Echo !TOKEN! >> Archivo.txt
   goto:eof
) ELSE (
      Echo !TOKEN! No se ha encontrado.
      Echo !TOKEN! >> Archivo2.txt
      goto:eof
)



Muchas gracias por todo y sobre todo por la paciencia,porque creo que estoy durando aqui mucho  :xD

Un saludo

SuperDraco

#13
el fallo está en la ruta:

%userprofile%\Escritorio\detectalo.txt


%userprofile%\Desktop\detectalo.txt


Usa el comando DIR para que te muestre los nombres de las carpetas.



EDITO: acabo de fijarme de nuevo en el código, has añadido rutas, acuerdate que entonces debes añadir esto:

Set Token=%%e
   call :Comprobar
Set Token=%%f
   call :Comprobar
Set Token=%%g
   call :Comprobar

Entiendes? , así por cada ruta y numero de tokens
No he vuelto, solo estoy de paso.

The Last Hero

#14
Tienes toda la razon ahora mismo va perfecto. Solo comentarte un matiz, tu codigo no elimina los archivos ocultos, porque lo probe,quedaria asi:

attrib -h !TOKEN!
  Del !TOKEN! \f \q \i \s >NUL 2>&1


Asi me funciono asi por lo menos...Una pregunta,con este codigo tambien puedo englobar procesos en memoria para matarlos?O sera otro para agruparlo en variables y luego taskkill?

Edito:tengo que ir a medida que vaya metiendo mas rutas aumentar lo de los tokens(
tokens=1,2,3,4,5,6,7,8,9 delims=;" ) o eso no hace falta

En cuanto tenga esa duda ya puedes dar por solucionado el tema. Me ha sorprendido tus conocimientos y espero que algun dia hagan moderador ya que te lo tomas en serio  ;)

Un saludo amigo y cuidate

leogtz

@The Last Hero

Usa por favor, las etiquetas de código, para eso están, para el código, no uses las citas para el código.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

The Last Hero

Ok perdona Leo lo tendre en cuenta, es que no suelo anda mucho por foros y claro, no se cual utilizar en cada caso xD

SuperDraco

#17
Antes de nada gracias por tu comentario respecto a ser moderador xDD

Vale, a ver, te explico:

Código (dos) [Seleccionar]
for /f "tokens=1,2,3 delims=;" %%a in ('"echo Ruta1;Ruta2;Ruta3"') do (
  Set Token=%%a
  call :Comprobar
  Set Token=%%b
  call :Comprobar
  Set Token=%%c
  call :Comprobar
)


Analizemos ese código, a mi manera xD

Tenemos 3 rutas que queremos separar de alguna manera, entonces necesitamos 3 tokens

Tokens=1,2,3

si pones el caracter * al final del último Token,así;
Tokens=1,2,3*

Tomará el resto que quede de palabras/frases/caracteres como un solo Token.

Osea, si el código fuese así:

for /f "tokens=1,2,3* delims=;" %%a in ('"echo Ruta1;Ruta2;Ruta3,Ruta4,Ruta5"') do

El token 1 seria Ruta1, el token 2 sería ruta 2, pero el token 3 seria "Ruta3;ruta4;Ruta5;"

Eso debes tenerlo en cuenta.

Así que respondiendo a tu pregunta, SI, por cada ruta que añadas debes añadir un Token, cada token se guarda en una variable para poder usarla, osea:

Token 1 = %%a
Token 2 = %%b
Token 3 = %%c

Así hasta la  Z

Si los tokens sobrepasan la cantidad del alfabeto A-Z, pues sinceramente no se como se seguiría, no he entrado mucho en esta matería del FOR, yo tambien estoy aprendiendo poco a poco.

Sigamos:
Delims=; es el caracter delimitador, en este caso el más sencillo me pareció el ;, esto significa que entre Ruta1;Ruta2;ruta3; Quedan separadas en tres tokens, token1,token2,token3 (%%a,%%b y %%c)


Listo xD.


Saludosss


EDITO:
Tal y como yo te puse el script, si que me borró un archivo oculto, pero bueno, si ya lo has arreglado a tu manera no importa.

Además, puedes usar ese mismo código para los procesos, simplemente cambia las rutas dentro del FOR, por los nombres de los procesos que quieres matar, y cambia el comando del "DEL" por un "Taskkill /F /T /im !TOKEN! >nul 2>&1"
No he vuelto, solo estoy de paso.

The Last Hero

Pero pitoloko ¿no se podria seguir con numeros?¿o con mas palabras como por ejemplo...

   Set Token=%%ae
   call :Comprobar
   Set Token=%%ba
   call :Comprobar
   Set Token=%%cd
   call :Comprobar

?

Es que tengo mas que 29 letras xD y claro si no se puede hacer mas va a ser un poco complicado... Lo digo porque he hecho multitud de archivos con la condicion if exist y si me dejaba utilizar caracteres numericos...pero no se, pero vamos es que 25 rutas solo no me llega...¿alguna idea? :-\

SuperDraco

Ya lo dije, no se si se puede hacer eso...


Lo que si que puedes hacer son 2 FOR, uno con 25 rutas, y luego duplicas ese mismo FOR en algún lugar de tu script, pero con las rutas que te faltan...

Queda un poco chapuzas, pero es una solución.

saludoss

No he vuelto, solo estoy de paso.