Quiero generar un fichero batch que, a partir de un fichero cualquiera, en este caso es un fichero PHP que contiene una serie de constantes, pudiese cambieer un contenido específico por otro que le pasara por parámetro. Como por ejemplo: sustituir "hola" por "
Respuesta de gggirald
1
1
gggirald, Experiencia en manejo de bases de datos Oracle, programación en...
Es la segunda vez que respondo y, como me suele ocurrir, no tomé la precaución de copiar mi respuesta de modo que me toca volverla a escribir. En la anterior cuando la envié mi usuario fue suplantado por un tal "dondescanso" supuesto experto en colchones que más parece un "bot" de propaganda. Decía en mi respuesta original que el tema de reemplazar cadenas en archivos mediante un programa batch (tal vez mejor llamarlo "guión") es un asunto delicado. Me he puesto a estudiarlo (y a buscar en la red también, por qué no decirlo) y según los condicionantes puede haber diferentes soluciones (por ejemplo no sería lo mismo sustituir palabras, es decir cadenas delimitadas por espacios o tabuladores, que sustituir cadenas que no tienen que coincidir con palabras). La solución que me parece más general y a la vez más sencilla (si olvidamos que precisa del comando SETLOCAL ENABLEDELAYEDEXPANSION, que no había usado nunca y es muy prometedor) es la que apunto aquí abajo: @echo off Setlocal EnableDelayedExpansion del kkk.txt if "%3" == "" goto ayuda for /f "tokens=* " %%i in (%3) do (set ANT=%%i echo !ANT:%1=%2! >> kkk.txt) goto fin :Ayuda Echo Reemplaza una cadena por otra en todo el contenido de un archivo echo Formato: sust cadorig cadsust archivo echo Ejemplos: echo sust de DE kk.txt :Fin Como se da a entender en la "ayuda" asumo que el código anterior se guarda como archivo SUST.BAT. El archivo con las sustituciones se guarda en KKK.TXT. Este código tiene algunos problemillas: elimina las líneas en blanco, elimina los espacios que preceden a una línea y no permite que en las cadenas sustituidora o sustituida haya espacios en blanco. Supongo que en un PHP el segundo problemilla puede ser el más importante. Mira a ver que tal te sirve. Si crees que habría que seguir intentándolo o tirar por otro camino puedes decírmelo. Saludos, GGG
Conseguir que desaparezca el segundo defecto que comentaba es muy sencillo, basta añadir "delims=" para que no considere a los espacios como delimitadores. Además queda más compacto y elegante (en mi opinión) con esta configuración: @echo off Setlocal EnableDelayedExpansion del kkk.txt if "%3" == "" goto ayuda for /f "tokens=* delims=" %%i in (%3) do (set ANT=%%i&echo !ANT:%1=%2! >> kkk.txt) goto fin :Ayuda Echo Reemplaza una cadena por otra en todo el contenido de un archivo echo Formato: sust cadorig cadsust archivo echo Ejemplos: echo sust de DE kk.txt :Fin Saludos, GGG
Con ayuda de una persona que sabe más que yo de esto he conseguido resolver también el tercer problema (el de los espacios en blanco en las cadenas sustituidora y/o sustituida). Solo quedaría la eliminación de las líneas en blanco. Así es como estaría ahora: @echo off Setlocal EnableDelayedExpansion del kkk.txt if "%3" == "" goto ayuda set cadorig=%1 set cadorig=%cadorig:"=% set cadsust=%2 set cadsust=%cadsust:"=% for /f "tokens=* delims=" %%i in (%3) do (set ANT=%%i&echo !ANT:%cadorig%=%cadsust%! >> kkk.txt) goto fin :Ayuda Echo Reemplaza una cadena por otra en todo el contenido de un archivo echo Formato: sust cadorig cadsust archivo echo Si las cadenas contienen espacios deben escribirse entrecomilladas echo El archivo corregido se deja en kkk.txt echo Ejemplo: echo sust de DE kk.txt :Fin Solo espero que la impaciencia no haya hecho que dejes de visitar este sitio porque sería una pena perder la oportunidad de que alguien use esto. Saludos, GGG
Me temo que no ha habido suerte y que mi respuesta ya no llegará a su destinatario. Una pena, aunque siempre me quedará el consuelo de haber aprendido algo yo mismo. Saludos (seguramente a nadie), GGG
Creo que esta web te estará enviando mis respuestas a tu dirección de correo. No sé si no dices nada porque no te llegan o porque ya no te interesa el asunto, tal vez porque ya lo hayas resuelto. Pero si recibes ésta me gustaría que cerraras la pregunta para que no se quede ahí enquistada. Creo que puedo descartarla, pero me parece una opción menos "elegante". Saludos y gracias, GGG
He comprobado que el bat no funciona, o no funciona bien, cuando en la cadena a sustituir o en la sustituidora hay algunos caracteres de los que se tratan de forma especial (=><"^!) Lo digo por si le sirve a alguien. GGG
8 comentarios
Ocultar comentarios
justo tengo ese problema, cuando la cadena contiene un = o un paréntesis - Carlos Clemente
Hay una solución con edlin, pero ese comando ha dejado de existir desde Windows Vista, según creo. Te sugiero que uses el powershell como shell alternativa an Windows a la "shell" CMD/MSDOS. Mira este enlace: Copiar contenido de un txt a otro - gggirald
Muchas gracias GIRALD, el problema que tengo es que estoy recorriendo un .txt que contiene la cade "variables=("vars")" y quiero borrar esa cadena en ciertos casos dentro de un for pero como contiene el signo "=" pues no lo he logrado. - Carlos Clemente
Una forma que se puede usar en ciertos casos para suprimir los "=" es utilizar el "=" como uno de los "delimitadores" del FOR. Por ejemplo algo como:for /f "tokens=1,2,3,* delims==" %%a in (prueba.txt) do (pero según lo que quieras hacer a continuación habrá que ajustar el resto del bat. Si te parece abre una consulta específica para poder seguir trabajando porque los comentarios son un poco limitadores. - gggirald
ah va que va GGIRALD, mil gracias, ok, lo voy a probar y si no abro la consulta. Mil gracias - Carlos Clemente
¿Por qué se elimina los caracteres de admiración? ! - horacio daniel
Como decía en mi último mensaje de este hilo el bat no funciona bien cuando en la cadena sustituidora o en la sustituida aparecen caracteres con significado especial como =><"^! pero no sabía que eliminara los ! del archivo. Voy a estudiar el asunto a ver si encuentro la causa y la solución. - gggirald
He visto que en el hilo del que hablaba en mi primer comentario de 24 feb 16 ya habíamos detectado el problema de las admiraciones (!) y se sugería usar powershell para resolver el problema. He hecho una incursión en ese tema pero la responderé en tu nueva consulta "como remplazar texto de un bloc de notas con archivo bat" - gggirald
justo tengo ese problema, cuando la cadena contiene un = o un paréntesis - Carlos Clemente
Hay una solución con edlin, pero ese comando ha dejado de existir desde Windows Vista, según creo. Te sugiero que uses el powershell como shell alternativa an Windows a la "shell" CMD/MSDOS. Mira este enlace: Copiar contenido de un txt a otro - gggirald
Muchas gracias GIRALD, el problema que tengo es que estoy recorriendo un .txt que contiene la cade "variables=("vars")" y quiero borrar esa cadena en ciertos casos dentro de un for pero como contiene el signo "=" pues no lo he logrado. - Carlos Clemente
Una forma que se puede usar en ciertos casos para suprimir los "=" es utilizar el "=" como uno de los "delimitadores" del FOR. Por ejemplo algo como:for /f "tokens=1,2,3,* delims==" %%a in (prueba.txt) do (pero según lo que quieras hacer a continuación habrá que ajustar el resto del bat. Si te parece abre una consulta específica para poder seguir trabajando porque los comentarios son un poco limitadores. - gggirald
ah va que va GGIRALD, mil gracias, ok, lo voy a probar y si no abro la consulta. Mil gracias - Carlos Clemente
¿Por qué se elimina los caracteres de admiración? ! - horacio daniel
Como decía en mi último mensaje de este hilo el bat no funciona bien cuando en la cadena sustituidora o en la sustituida aparecen caracteres con significado especial como =><"^! pero no sabía que eliminara los ! del archivo. Voy a estudiar el asunto a ver si encuentro la causa y la solución. - gggirald
He visto que en el hilo del que hablaba en mi primer comentario de 24 feb 16 ya habíamos detectado el problema de las admiraciones (!) y se sugería usar powershell para resolver el problema. He hecho una incursión en ese tema pero la responderé en tu nueva consulta "como remplazar texto de un bloc de notas con archivo bat" - gggirald