Modificar una palabra por otra en .txt con batch

He intentado modificar una palabra por otra en un archivo .txt mediante batch pero solo me abre el archivo y no me cambia las palabras .

El archivo se llama purchs.txt y quiero cambiar la palabra de "trans" a "purchs"

Así lo estoy haciendo:

@echo off

Setlocal enabledelayedexpansion

for /f "tokens=* delims=" %%x in ('purchs.txt') do (
set linea=%%x
set linea=!linea:trans=purchs!
call :show !linea!
)
Goto:eof
:Show
echo %* >> out.txt
Goto:eof

¿En qué estoy equivocándome?

1 respuesta

Respuesta
1

Por lo que he podido ver tu único error es haber puesto entre comillas simples el nombre del archivo. El FOR debería ser así:

for /f "tokens=* delims=" %%x in (purchs.txt) do (

Por otra parte no sería necesario usar CALL aunque puede estar justificado si vas a hacer más cosas con las líneas cambiadas.

no me funciono, me indica que no se encuentra la ruta especificada, por lo que la comilla simple es necesaria....al tener comilla simple me abre el archivo por lo menos, pero aun no me cambia el texto...

La comilla simple no conseguirá lo que pretendes. Hay que averiguar por qué dice que no se encuentra la ruta especificada. Se me ocurre que puede ser porque esa ruta tiene espacios incluidos. Si es así lo que tendrás que hacer es ponerla entre comillas dobles, no simples. Antes de descartar tu opción deberías probar con un archivo que no tenga peculiaridades en el nombre. Te paso el ejemplo con el que he probado para que veas que funciona correctamente:

D:\BAT>type purchs.txt
Primera linea ghkjhjhjk jjkk
Segunda linea con trans y transportes y mas trans
transtrans sin transtrans
otra con trans y purchs
D:\BAT>type mauri.bat
@echo off
Setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in (purchs.txt) do (
set linea=%%x
set linea=!linea:trans=purchs!
call :show !linea!
)
goto:eof
:show
echo %* >> out.txt
goto:eof
D:\BAT>type out.txt
El sistema no puede hallar el archivo especificado.
D:\BAT>mauri
D:\BAT>type out.txt
Primera linea ghkjhjhjk jjkk
Segunda linea con purchs y purchsportes y mas purchs
purchspurchs sin purchspurchs
otra con purchs y purchs

Puedes ver el contenido del purchs.txt y del mauri.bat (listados mediante TYPE). También que el out.txt no existía antes de ejecutar el bat y que luego tiene el contenido esperado.

me crea el archivo out pero no me modifica la palabra requerida dentro del archivo purchs.txt....

en el archivo out solo se repite la palabra purchs, pero no se realiza cambio de modificar el texto 

Pero, ¿ya has conseguido que lea el PURCHS.TXT en su ubicación? ¿Era el problema del espacio?

Ahora ten en cuenta que debes borrar el OUT.TXT antes de ejecutar el bat porque con la sintaxis del ECHO te va a añadir a lo que ya hubiera y eso puede dar lugar a malas interpretaciones.

Si quieres poner unos comandos de depuración puedes incluir el comando

Echo ! Linea!

Antes y después del SET de sustitución, para ver si es que el SET no está haciendo lo que se espera de él.

El .bat esta armado de la siguiente manera:

@echo off
Setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in ('purchs.txt') do (
set linea=%%x
set linea=!linea:trans=purchs!
call :show !linea!
)
goto:eof
:Show
echo %* >> out.txt
goto:eof

al hacerlo con comilla simple me arroja la siguiente pantalla del CMD (me abre el archivo .txt y queda el cmd en negro. Detallo el archivo .txt y .bat en rojo)

Al hacerlo sin comillas no pasa nada y al hacerlo con doble comilla me crea el out.txt, el cual muestra lo siguiente:

Lo que necesito es que en le archivo purchs.txt la palabra trans sea modificada y se cambie por purchs...

Tal ves la fórmula este bien y el problema sea la parametrización del archivo, ya que al abrirlo con texpad y tratar de copiar el texto me ocurre eso:

Estoy seguro que tu demás puedes dar con la solución de esto, yo no me la pude :(

Insisto en que con comillas simples no vas a conseguir nunca lo que pretendes.

Pero acabo de darme cuenta de que con comillas dobles no lo toma como archivo sino como una lista con un solo valor, precisamente "purchs.txt". Esa es la razón de que el contenido del out.txt sea el que dices.

Si ejecutas el bat en la misma carpeta en la que está el purchs.txt tiene que funcionar sin comillas, aunque el formato de ese archivo puede dar problemas porque parece contener caracteres que no son de texto. Prueba a hacer un TYPE PURCHS.TXT a ver que sale y pon el resultado en un snippet para que pueda copiarlo e intentarlo yo.

no se si estare utilizando bien el comando type :

@echo off
Setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in (TYPE purchs.txt) do (
set linea=%%x
set linea=!linea:trans=purchs!
call :show !linea!
)
goto:eof
:Show
echo %* >> out.txt
goto:eof

echo off
Setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in (TYPE purchs.txt) do (
set linea=%%x
set linea=!linea:trans=purchs!
call :show !linea!
)
goto:eof
:Show
echo %* >> out.txt
goto:eof

Al ampliar tu último pantallazo ya he visto dónde está el problema. Antes no había conseguido leer el texto de la ventanita emergente que dice: "No se puede cortar, copiar o arrastrar y soltar texto que contenga caracteres nulos (código = 0)". El archivo contiene "caracteres nulos" y esos caracteres no puede manejarlos el comando FOR. Prueba a crearte un purchs.txt de prueba, que no contenga caracteres nulos (son caracteres cuyo código ASCII es el cero) y verás como funciona correctamente (sin comillas, ni simples ni dobles)-

No era así como quería que lo hicieras sino abriendo una ventana CMD, yendo a la carpeta donde tienes el archivo y tecleando:

type purchs.txt

Y copiando lo que saliera, pero ya no es necesario. Podrías probar con el TYPE dentro del comando FOR, como has hecho, pero entonces sí que tiene que estar dentro de comillas simples. Así:

for /f "tokens=* delims=" %%x in ('TYPE purchs.txt') do (

De todas formas he probado con líneas con nulos y aunque no los pasa al out.txt no parece tener mayores problemas. Para crear caracteres nulos hace falta un editor hexadecimal como el Ultra-Edit

¡Gracias!

Me funciono como dijiste... igual tengo que utilizar las cifras hexadecimales, así que practicare un poco con el utraedit...

Gracias bro!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas