Modificar archivo de texto sin conocer su ruta

Iniciado por KISKE, 19 Diciembre 2012, 10:28 AM

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

KISKE

Hola,
Tengo un problema, el código funciona, pero hay un cierto incoveniente, hago varias pruebas de lo mismo, y hay veces que tarda menos y otras veces más, incluso me llegó a tardar hasta 2 minutos o más.

Lo que quería saber es si hay algúna otra forma de hacer lo que estoy haciendo pero de forma más rápida.

Código (bash) [Seleccionar]
@echo off

del /q "%userprofile%\salida.txt"

cls

color 0b
title Instalador

@echo Bienvenido al instalador blah blah blah
@echo.
@echo.
pause

cls

@echo Bienvenido al instalador blah blah blah

@echo.
@echo.

@echo Modificando el ARCHIVO_XX.txt
@echo.
@echo Por favor, no cierre el programa

for %%i in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
IF EXIST %%i:\ (
dir /b /s %%i:\ | find  "ARCHIVO_XX.txt" >> "%userprofile%\salida.txt"
)
)

<"%userprofile%\salida.txt" set /p "ruta="

set ruta=%ruta:ARCHIVO_XX.txt=%

cd %ruta%

echo. >> ARCHIVO_XX.txt

echo Archivo modificado >> ARCHIVO_XX.txt

del /q "%userprofile%\salida.txt"

cls

@echo Bienvenido al instalador blah blah blah
@echo.
@echo.
@echo El programa ha concluido con exito.

@echo.
@echo.
@echo.

pause



Gracias!

Eleкtro

- Suponiendo que tengas una unidad de diskette conectada y asociada a la letra "A", podrías descartarla del FOR, sobretodo si la diskettera está vacía, tardará un minuto en leer la diskettera y acabará saltando un mensaje de error porque no se encuentra ningún diskette dentro.


- En este comando estás esperando a una salida, y después de obtenerla, la filtras al comando find, es totálmente innecesario y hace que tarde más:
dir /b /s %%i:\ | find  "ARCHIVO_XX.txt"

Código (dos) [Seleccionar]
(
for %%i in (b c d e f g h i j k l m n o p q r s t u v w x y z) do (
IF EXIST %%i:\ (dir /b /s "%%i:\ARCHIVO_XX.txt" >> "%userprofile%\salida.txt")
)
)


Aparte de lo comentado, puedes mejorar la sintaxis y simplificar el código:
- Ahorrando la orden de ocultar la salida dle echo todo el rato... @echo., usa "echo.", sin la arroba,
- Creando un FOR que solo trabaje en las unidades que exiten conectadas:
fsutil fsinfo drives

saludos








KISKE

Excelenteee!
Gracias por los consejos, ya borré todos los @ de los echo.

Sin embargo, no supe como trabajar con el fsutil fsinfo drives, pero seguiré intentando.

El bucle me quedo así:
Código (bash) [Seleccionar]
for %%i in (b c d e f g h i j k l m n o p q r s t u v w x y z) do (
IF EXIST %%i:\ (
dir /b /s %%i:\"ARCHIVO_XX.txt" >> "%userprofile%\salida.txt"
)
)


Si las comillas incluían a la ruta (%%i:\) lanzaba un error, es por eso que solo se lo puse al nombre del archivo.


Muchas gracias nuevamente!

Eleкtro

Cita de: .k19 en 19 Diciembre 2012, 19:46 PMno supe como trabajar con el fsutil fsinfo drives, pero seguiré intentando.
Bueno lo cierto es que el output de FSUTIL es una línea y necesitarías averiguar cuantos tokens debes crear en el FOR, mejor puedes hacerlo usando WMIC para obtener una un output multi-línea:

Código (dos) [Seleccionar]
For /F "tokens=2 delims==" %%@ in ('wmic logicaldisk get name /Format:list') Do (
echo %%@
)


Cita de: .k19 en 19 Diciembre 2012, 19:46 PMSi las comillas incluían a la ruta (%%i:\) lanzaba un error, es por eso que solo se lo puse al nombre del archivo
Es extraño, a mi me funcionó correctamente (¿Lo probaste en Win7?, ahí funciona)








KISKE

Gracias nuevamente, aunque tengo un pequeño problema que no sé como resolverlo.
El parámetro %%@ devuelve las rutas pero solo con el formato LETRA:, es decir, la / no la inserta, y sin eso, no puedo continuar.

No soy muy bueno en Batch por lo que no pude resolver el problema, el código quedo así pero como dije, falta la / después de %%@.

Código (bash) [Seleccionar]
for /f "tokens=2 delims==" %%@ in ('wmic logicaldisk get name /Format:list') do (
IF EXIST %%@ (
dir /b /s %%@"ARCHIVO_XX.txt" >> "%userprofile%\salida.txt"
)
)



Por cierto, si, lo probé en Windows7, y sin embargo la " no puede incluír a la ruta porque me lanza error, no sé cual será el motivo, pero así me funciona.


Gracias!

Eleкtro

#5
El "If Exists" que has añadido es innecesario, como te expliqué el comanod que utilizo del wmic sirve para obtener las unidades conectadas, osea las unidades que existen...

Te da ese tipo de error con los caracteres porque la salida del comando wmic está en unicode por defecto,
debí haber previsto que podrías tener problemas para la intención que quieres darle al usar el formato "list".

Aquí tienes:
Código (dos) [Seleccionar]
For /F %%@ in ('wmic logicaldisk get name /Format:texttable ^| Find ":"') do (
   (DIR /B /S "%%@\ARCHIVO_XX.txt")>> "%userprofile%\salida.txt"
)
Pause&Exit








KISKE

Funcionó perfectamente, aunque creo que tiene un error.

Cuando explora el primer disco (en mi caso C:/, que es donde está el ARCHIVO_XX.txt), no pasa nada y hace todo correctamente, pero luego saltan dos errores en la consola y dice lo siguiente:

El dispositivo no está listo.
El dispositivo no está listo.

Si no me equivoco se refiere a los discos E:/ y F:/ que son unidades de CD y no tengo ningún CD dentro.

Hay alguna solución para eso ?


Gracias!

Eleкtro

Cita de: .k19 en 20 Diciembre 2012, 12:56 PM
Hay alguna solución para eso ?
Listar únicamente los discos fijos:

Código (dos) [Seleccionar]
@echo off
For /F "tokens=2" %%@ in ('wmic logicaldisk get name^,drivetype /Format:texttable ^| Find "3"') do (
(DIR /B /S "%%@\ARCHIVO_XX.txt")>> "%userprofile%\salida.txt"
)
Pause&Exit








KISKE

Genial, muchas gracias por todo y también gracias por las rápidas respuestas!