(solucionado) [batch] error con findstr

Iniciado por shadowhunter, 9 Octubre 2013, 13:49 PM

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

shadowhunter

Estoy haciendo una pequeña utililidad que se basa principalmente en la creación y edición de archivos .txt y tengo un problema con la parte de eliminar una linea concreta de un txt.

el programa primero nos muestra en pantalla el contenido del txt:



y nos da a elegir que contenido queremos eliminar, pero al escribirlo en vez de decir que se ha eliminado y volver a cargar la ventana, carga directamente y sin eliminar el contenido:



Alguien sabria decirme donde esta equivocado el codigo????

@echo off
title Animefiles 1.3.2
COLOR 70
mode con: cols=75
@set ruta1= %CD%\Files
:RETURN
CD Files
cls
echo.
echo ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo º  Eliminar un anime    º
echo ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ |MORE
echo ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ |MORE
Dir /b
echo ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ |MORE
Echo introduzca la lista de donde quiere eliminar un anime:
echo.
set/p "anime=>"
if not exist %anime%.txt goto ERROR2
if not defined anime goto RETURN
:RESETDEL
cls
echo.
echo ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ |MORE
FOR /F "tokens=*" %%A IN (%anime%.txt) DO (echo.%%A) |MORE
echo ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ |MORE
echo Para salir del modo, cerrar el programa. |MORE
echo Seleccione el anime a borrar:
echo.
set/p "borrar=>"
if not defined borrar goto resetdel
echo.
Type "%ruta1%\%anime%.txt" | findstr /V /I "%borrar%">"%ruta1%\%anime%.tmp"
Del /Q "%ruta1%\%anime%.txt"
Rename "%ruta1%\%anime%.tmp" "%anime%.txt"
cls
echo.
echo el anime ha sido eliminado satisfactoriamente. |MORE
pause
goto RESETDEL

:ERROR2
cls
echo ÉÍÍÍÍÍÍÍÍÍÍÍ»
echo º   ERROR   º
echo ÈÍÍÍÍÍÍÍÍÍÍͼ |MORE
echo No existe una lista con ese nombre. |MORE
pause
CD..
start Animefiles
exit

Eleкtro

#1
Hola

1. Esto déjalo así, sin espacios delante del "=":
Código (dos) [Seleccionar]
set "ruta1=.\Files"

2. Esto déjalo así, encerrando la expresión.
Código (dos) [Seleccionar]
FOR /F "usebackq= delims=" %%A IN ("%anime%.txt") DO (Echo.%%A) | MORE

3.
Citar
Código (dos) [Seleccionar]
set /p "borrar=>"
if not defined code goto resetdel

No tienes ninguna variable llamada "code" en el código, así que siempre va a regresar a la misma etiqueta,
y por eso siempre te muestra el mismo contenido, porque no borras ninguno.


Arreglando el tercer paso (corrigiendo la condicional "If not defined") sería suficiente para que te funcionase de la forma que necesitas.


Saludos








shadowhunter

Gracias! lo de la variable code es que le habia cambiado el nombre y no me di cuenta de sustituirlo en el if.

Pero sigue sin funcionar y ahora al sustituir el for al ejecutar en vez de mostrarme el contenido me pone:

No se esperaba = delims=" en este momento.

A que se debe?

Eleкtro

Cita de: shadowhunter en  9 Octubre 2013, 16:20 PMNo se esperaba = delims=" en este momento.

A que se debe?

Perdón, eso es un error por mi parte, lo escribí al vuelo y cometí un error de sintaxis, déjalo así:

FOR /F "usebackq delims=" %%A IN ("%anime%.txt") DO (Echo.%%A) | MORE

Saludos








shadowhunter

Solucionado el problema del for, pero sigue sin borrar el registro del txt sino que cierra el programa directamente.

Pongo el codigo modificado:

@echo off
title Animefiles 1.3.2
COLOR 70
mode con: cols=75
set "ruta1=.\Files"
:RETURN
CD Files
cls
echo.
echo ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo º  Eliminar un anime    º
echo ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ |MORE
echo ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ |MORE
Dir /b
echo ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ |MORE
Echo introduzca la lista de donde quiere eliminar un anime:
echo.
set/p "anime=>"
if not exist %anime%.txt goto ERROR2
if not defined anime goto RETURN
:RESETDEL
cls
echo.
echo ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ |MORE
FOR /F "usebackq delims=" %%A IN ("%anime%.txt") DO (Echo.%%A) | MORE
echo ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ |MORE
echo Para salir del modo, cerrar el programa. |MORE
echo Seleccione el anime a borrar:
echo.
set/p "borrar=>"
if not defined borrar goto resetdel
echo.
Type "%ruta1%\%anime%.txt" | findstr /V /I "%borrar%">"%ruta1%\%anime%.tmp"
Del /Q "%ruta1%\%anime%.txt"
Rename "%ruta1%\%anime%.tmp" "%anime%.txt"
cls
echo.
echo el anime ha sido eliminado satisfactoriamente. |MORE
pause
goto RESETDEL

:ERROR2
cls
echo ÉÍÍÍÍÍÍÍÍÍÍÍ»
echo º   ERROR   º
echo ÈÍÍÍÍÍÍÍÍÍÍͼ |MORE
echo No existe una lista con ese nombre. |MORE
pause
CD..
start Animefiles
exit


Llevo varias semanas comiendome la cabeza con este problema, sino se puede asi me vale alguna otra solucion. thaks!

Eleкtro

#5
Cita de: shadowhunter en  9 Octubre 2013, 16:36 PMpero sigue sin borrar el registro del txt sino que cierra el programa directamente.

Esta modificación del código me ha funcionado corréctamente:

Código (dos) [Seleccionar]
@Echo OFF & Color 70 & MODE con cols=75
Title Animefiles 1.3.2

SET "Directory=.\Files"
REM SET "Directory=.\"

:RETURN
PUSHD "%Directory%" 2>NUL || (Call :ERROR "1")
cls
echo.
echo ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo º  Eliminar un anime    º
echo ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ                                                  |MORE
echo ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ |MORE
Dir /B "*.txt"
echo ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ |MORE
Echo introduzca el nombre de la lista de donde quiere eliminar un anime:
echo.
set /P "File=>"
If NOT Defined File (Goto :RETURN)
If /I NOT "%File:~-3%" EQU "txt" (Set "File=%File%.txt")
If NOT exist "%File%" (Call :ERROR "2")

:RESETDEL
cls
echo.
echo ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ |MORE
FOR /F "usebackq delims=" %%A IN ("%File%") DO (Echo.%%A) | MORE
echo ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ |MORE
echo Para salir del modo, cerrar el programa. |MORE
echo Seleccione el anime a borrar:
echo.
set/p "borrar=>"
if not defined Borrar (goto :resetdel)
echo.
Type "%Directory%\%File%" | Findstr /V /I "%borrar%">"%Directory%\%File%.tmp"
Del /Q "%Directory%\%File%"
Rename "%Directory%\%File%.tmp" "%File%"
cls
echo.
echo el anime ha sido eliminado satisfactoriamente. |MORE
pause
Goto :RESETDEL

:ERROR
cls
echo ÉÍÍÍÍÍÍÍÍÍÍÍ»
echo º   ERROR   º
echo ÈÍÍÍÍÍÍÍÍÍÍͼ |MORE
REM Para manejar varios tipos de errores...
If "%~1" EQU "1" (Echo No existe un directorio con ese nombre. |MORE)
If "%~1" EQU "2" (Echo No existe una lista con ese nombre. |MORE)
Pause
POPD
Start Animefiles
Exit


Si en tu caso sigue sin funcionar deberías proporcionar un ejemplo real del archivo de "lista" (los animes que hay que borrar) y del patrón de búsqueda que le pasas al comando "FindStr"

Saludos








shadowhunter

Gracias por la ayuda!

Parece ser que el findstr no admitia la ruta mediante variables asi que puse la ruta directamente y funciona perfectamente:

Type "C:\Program Files\Animefiles\Files\%File%" | Findstr /V /I "%borrar%">"C:\Program Files\Animefiles\Files\%File%.tmp"
pause
Del /Q "C:\Program Files\Animefiles\Files\%File%"
Rename "C:\Program Files\Animefiles\Files\%File%.tmp" "%File%"


En verdad asi me vale ya que el programa se encuentra en una ruta estatica. Gracias por el esfuerzo y la ayuda.

Solucionado!

shadowhunter

Aprovecho el tema para preguntar un par de dudas que me han surgido al analizar la simplificación del code:

La primera es que hace esta linea:
PUSHD "%Directory%" 2>NUL || (Call :ERROR "1")

Y la segunda no entiendo el funcionamiento de estos if y para que sirve POPD

:ERROR
cls
echo ÉÍÍÍÍÍÍÍÍÍÍÍ»
echo º   ERROR   º
echo ÈÍÍÍÍÍÍÍÍÍÍͼ |MORE
If "%~1" EQU "1" (Echo No existe un directorio con ese nombre. |MORE)
If "%~1" EQU "2" (Echo No existe una lista con ese nombre. |MORE)
Pause
POPD


Si alguien me puede ayudar a resolver estas dudas...