BAT. Cambiar 2 palabras en un txt

Iniciado por Pela667, 24 Enero 2014, 19:43 PM

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

Pela667

Hola muchachada.
De vez en cuando consulto este foro y mas de una vez me sacaron del apuro.
Esta vez no tuve suerte, ya que lo que estoy necesitando no lo pude encontrar.
El tems es que necesito reemplazar 2 palabras en un txt, y hasta donde llegan mis muy basicos conocimientos de programación, llego a cambiar solo uno.
el codigo es el siguiente, a ver si me pueden tirar una soga.

@echo off
setlocal enabledelayedexpansion
attrib -r weather.txt
set num1=Race1
for /f "tokens=*" %%A in (weather.txt) do (set "resultado=%%A")&call :sub
copy salida.txt weather.txt
del salida.txt
attrib +r weather.txt
goto:eof
:sub
echo !resultado:Qualify2=%num1%!>>salida.txt
goto:eof


Esto me cambia Qualify2 por Race1, y funciona ok.
A su vez, necesito agregar otra palabra a cambiar, pero no se como se trabaja con mas de una variable, o si existe otra manera de hacerlo.
Espero haber sido claro.
Desde ya, muchisimas gracias!

Pela667

#1
bueno, encontre una manera malisima de que funcione, pero si alguien se copa en mejorar este enchastre, bienvenido.
hice esto, ya se que me gane todas las puteadas, pero es lo que hay...
@echo off

setlocal enabledelayedexpansion
start GTR2WGen.exe
ping -n 3 127.0.0.1 > null
setlocal enabledelayedexpansion
attrib -r weather.txt
set num1=Race1
set num2=Race2
set num3=Race1

for /f "tokens=*" %%A in (weather.txt) do (set "resultado=%%A")&call :sub
for /f "tokens=*" %%A in (salida.txt) do (set "resultado2=%%A")&call :sub2
for /f "tokens=*" %%A in (final.txt) do (set "resultado2=%%A")&call :sub3
copy fin.txt weather.txt
attrib +r weather.txt
del null
del GTR2WGenLog.txt

:sub
echo !resultado:Qualify2=%num1%!>>salida.txt
goto:eof

:sub2
echo !resultado2:Race=%num2%!>>final.txt
goto:eof

:sub3
echo !resultado2:Race21=%num3%!>>fin.txt
goto:eof



el ping es para que me haga una pausa y le da tiempo al exe a generar los archivos que despues modifico... es la unica que encontre para hacer.
y por algun motivo, cuando modifico el primer race1, al buscar el race para cambiarlo por race2, me modificaba el race1 por race21... ni idea el motivo, pero cree un txt nuevo y lo solucione...

Almapa

Ufff Pela667, te has complicado mucho, mira a ver si de este modo te sirve:

@echo off
setlocal enabledelayedexpansion
attrib -r weather.txt
set num1=Race1
set num2=Race2
for /f "tokens=*" %%A in (weather.txt) do (set resultado=%%A && call :sub)
copy salida.txt weather.txt
del salida.txt
attrib +r weather.txt
goto:eof
:sub
set resultado=!resultado:Qualify1=%num1%!
set resultado=!resultado:Qualify2=%num2%!
echo %resultado%>>salida.txt
goto:eof


dentro de ":sub" puedes poner tantas cosas como quieras cambiar.


Un saludo

Eleкtro

#3
Acerca del reemplazamiento de palabras en un archivo de texto, ya te han dado una solución, pero siempre está bien mostrarle otras alternativas y enfoques a la persona que tiene dudas y por eso yo te habría sugerido diréctamente cualquier otro lenguaje que no sea Batch (uno sencillo que puedes usar es VBS), te muestro un ejemplo para reemplazar palabras:

Código (vb) [Seleccionar]
Set FSO     = CreateObject("Scripting.FileSystemObject")
OldTextFile = ".\Archivo.txt"
NewTextFile = ".\Nuevo Archivo.txt"
ReplaceFrom = "Hello"
ReplaceTo   = "Aló"

FSO.CreateTextFile(NewTextFile, 2). _
Write(Replace(FSO.OpenTextFile(OldTextFile, 1).ReadAll(), _
 ReplaceFrom, ReplaceTo, 1, -1, vbTextCompare))



De todas formas también podrías usar la función "RSA" para reemplazar palabras, de esta rutina que codeé para utilizar en Batch ~> [BATCH] [APORTE] Rutina TEXTMAN para manipular archivos de texto

Ejemplo de uso:
Call :TEXTMAN RSA "Archivo.txt" "ElHacker.net" "LeJuakér.né"

Citar@Echo OFF

:: TEXT MANIPULATOR ROUTINE v0.5
:: By Elektro

:: SYNTAX:
::
:: TEXTMAN [ACTION] [LINE(S)] [FILE] [TEXT]
::
:: * [LINE(S)] parameter is Optional for some actions
:: * [TEXT] parameter is Optional for some actions

:: ACTIONS:
::
::  RSA = REPLACE_STRING_ALL * Replace word from all lines.

:: EXAMPLES:
::
:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
::                                                                         ::
:: Replace the words "Elektro" to "H@cker" in all lines.                   ::
:: Call :TEXTMAN RSA "Test.txt" "Elektro" "H@cker"                         ::
::                                                                         ::
:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::


:TEXTMAN
(SET /A "A=0", "LINE=0", "TOTAL_LINES=0")  &  (CALL :%~1 %* || (ECHO Invalid parameter & Exit /B 1)) & (GOTO:EOF)
:RSA
(For /F "tokens=1* delims=]" %%A in ('type "%~2" ^| find /n /v ""') DO (CALL SET "STRING=%%B" && (if "%%B" EQU "" (Echo+>> "%~2.NEW") ELSE ((CALL ECHO %%STRING:%~3=%~4%%)>>"%~2.NEW")))) && (CALL :RENAMER "%~2") & (GOTO:EOF)
:RENAMER
(REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~1.BAK" "%TEMP%\" >NUL) & (REN "%~1.NEW" "%~nx1") & (GOTO:EOF)





Cita de: Pela667 en 24 Enero 2014, 21:38 PM
start GTR2WGen.exe
ping -n 3 127.0.0.1 > null

Citarel ping es para que me haga una pausa y le da tiempo al exe a generar los archivos que despues modifico

Te sugiero que leas la sección de ayuda de cada comando que vayas a usar, para no acabar haciendo cosas sin sentido.

Cita de: Start /?Start /?

WAIT        Iniciar aplicación y esperar a que finalice comando o programa

Así pues, esta sería la orden:
Start /W "Título" "GTR2WGen.exe"
(Y eliminas el ping, obvio)

Hay varías cosas más erroneas en los códigos que has mostrado (en las lineas del FOR sobre todo) pero no entraré más en detalles ya que te dí otra solución mejor que Batch y el compañero @Almapa ya te arregló esos otros errores que tuviste.

Saludos!