Entiendo que es un código obsoleto y que hay otras opciones mas actuales y mejores
Bueno, "obsoleto" es un término muy...peliagudo y más de una vez me han criticado por llamar obsoleto a las cosas, así que dejémoslo en "insuficiente". Simplemente Batch no da la talla necesaria para cubrir ciertas necesidades de forma eficiente...
Mi desconocimiento es tal que todavía no soy capaz de saber como es posible que el código del compañero funcione
Sinceramente no me entusiasma ponerme a analizar y desglosar códigos espagueti y menos escritos en Batch, pero lo haré para intentar ayudarte a que trates de discernir por ti mismo la gravedad del asunto:
Empecemos por la parte más relevante del código, estas lineas:
Citar
Código:
@echo off
set n=HT
setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in ('type texto.txt') do (
set linea=%%x
set linea=!linea:version=%n%!
En esta variable se define el reemplazamiento ("HT")
Citar
Código
set n=HT
Luego, lo que se hace es utilizar un búcle de tipo For /Files para iterar las lineas del texto. Cada linea de texto se almacena en la variable de For %%x:
Citar
Cada linea se reasigna en la variable !linea!
Citar
Código
Seguidamente se lleva a cabo un string replacement (el reemplazamiento de texto) en el que se le indica que se debe reemplazar el texto "versión" (recuerda que esto se hace en todas las lineas) por el valor de la variable %n%, es decir, "HT":
Citar
Código
Ese reemplazamiento de por si ya es un fallo muy grave, puesto que dará falso positivo / resultados indeseados en cualquier linea que contenga el texto "version". Por ponerte un ejemplo, esto:
Código:
texto_Version_texto=85045
Código:
texto_HT_texto85045
Bueno, sigamos...
El caracter del símbolo igual = se define más tarde en esta variable:
Citar
Código
Set Caracter=^=
Código:
Set "Caracter=="
Luego, en la rutina :Buscador se itera cada caracter de la linea, es decir, se va procesando cada caracter hasta encontrar el caracter que coincida con la variable "%caracter%", es decir, el símbolo de igual =.
De nuevo aquí se usa una mala práctica además de ser muy peligrosa (y de verdad), la Recursividad, esto es cuando una función se llama así misma de forma indefinida para resolver un problema ( en el código: Goto Buscador ). Esto quiere decir que si usases ese algoritmo recursivo (la rutina :Buscador del script de @Aincrad) sobre un archivo con muchas (pero muchas) lineas de texto/caracteres, inevitablemente desembocaría en un error conocido como Stack Overflow, el cual indica un agotamiento de espacio en la capacidad de almacenamiento de la pila de llamadas por un exceso de llamadas (como resulta evidente), y este error imposibilitaría que el programa/algoritmo pudiese proseguir y finalizar su ejecución.
..Por no decir que para cumplir el objetivo de reemplazar un texto se han tenido que escribir ni más ni menos que 104 lineas de código en Batch, compañero, 104. Fíjate en las 10 simples lineas que te ofrece el lenguaje PowerShell para llevar a cabo la misma tarea y de forma mucho más estable. Ojo, no estoy insinuando que esto tenga que ver con la forma de programar y estructurar/organizar del compañero @Aincrad (bueno, un poco si xD, el código se puede simplificar mucho) sino con las limitaciones por naturaleza que implica el uso de Batch, donde en otros lenguajes son 10 lineas, en Batch serán 100... e imperfectas.
Eso son solo algunos de las muchos problemas que uno tiene que sufrir al trabajar con Batch, es horrible e inestable realizar este tipo de tareas en Batch, por que Batch no fue diseñado para esto, pero la gente se acostumbra y se acostumbra y se creen que les vale para todo... todo lo quieren hacer con Batch, incluso, cuando NO SE PUEDE (o se puede, pero MAL... de forma inestable).
Mira, para que puedas tener una alternativa a la solución de @Aincrad, te voy a enseñar un código que desarrollé hace mucho tiempo y quizás podría servirte para llevar a cabo modificaciones de archivos de texto en Batch como reemplazar texto de forma sencilla:
El código entero lo copiarias dentro de tu script, abajo del todo, tal que así:
Código
@Echo OFF REM Aquí los comandos originales de tu script... REM ... REM Aquí abajo insertas todo el código de la rutina :TEXTMAN :TEXTMAN REM ...
y la sintaxis de utilización sería la siguiente:
Código:
Call :TEXTMAN RSA "Archivo.txt" "Perl=" "HC"
...pero hace años que no utilizo ese código del demonio, no sé si estará del todo libre de bugs, y no lo pienso revisar (siendo un código escrito en el odioso Batch xD).
si tengo que ir a algún sitio y me das la opción de conducir en mi coche viejo o en el deportivo mas potente y mas moderno elegiré el coche viejo que aunque no soy piloto se como conducirlo mas o menos.
Es una decisión tan respetable como cualquier otra, pero piensa que el "coche" antiguo siempre manifestará algún tipo de problemas: se atascarán las marchas, el cuentakilómetros irá mal, el retrovisor no encajará bien, tendrás que darle golpecitos a la puerta para que se cierre del todo, te sentirás escaso de accesorios útiles en su interior... etcétera. El "coche" antiguo te podrá hacer sentir muy cómodo por esa sensación de familiaridad, pero eso no quita la realidad, y la realidad es que es inevitable que lo antiguo se desgaste y se invente algo que lo supere con creces, algo actual, más completo y sofisticado mientras que lo antiguo se desgasta, y ese desgaste (u obsolescencia) solo conseguirá que tus movimientos sean excesivamente torpes en comparación con lo que actualmente tienes a tu disposición (lo "moderno")...
De todas formas, si migrases a PowerShell no sería lo equivalente a comprarse el mejor coche deportivo del mundo, sino más bien sería como comprarse un coche mucho mejor que el coche antiguo para estos tiempos que corren, y sin perder esa relación de...manejo o aprendizaje amistoso.
Una de las muchas ventajas que supondría aprender otro lenguaje de programación... y ya no me estoy refiriendo a PowerShell, sino AL QUE SEA, seria darte cuenta de como lo que para desarrollar un algoritmo en Batch puede suponer escribir 100 lineas (que además serían 100 lineas de código espagueti e inestable), en ese otro lenguaje podrías simplificarlo a 10 lineas... con la diferencia y el ahorro de tiempo que eso conlleva, entre otras cosas.
Luego hay otros beneficios como las características de depuración de código o el soporte de un paradigma orientado a objetos, son cosas que no serían tan perceptibles para una persona que se acabe de iniciar en la programación o que no sepa mucho, pero siguen siendo cosas que en Batch tampoco tienes y te están limitando...sin que sepas demasiado bien el por qué.
No intento convencerte de nada xD pero quería darte mi opinión al respecto para que lo pudieras reflexionar desde la perspectiva adecuada (no sé si lo habré conseguido). Si yo quisiera recomendarte lo que considero el "mejor" lenguaje entonces no sería PowerShell (sería VB.NET o C#), PowerShell es el lenguaje que te recomiendo si quieres un lenguaje de scripting que no necesite instalar ningún "intérprete" adicional en Windows y con el que poder programar scripts sencillos o avanzados, me refiero, poder hacer de todo con libertad, estabilidad y sofisticación (sin duda infinitamente más que en Batch y VBS... en todos los sentidos posibles).
También debo decir que por supuesto para escribir scripts de forma esporádica para resolver algún problemilla como éste de reemplazar lineas de texto pues... no necesitas realizar el tremendo esfuerzo de aprender un nuevo lenguaje, pero si en el futuro sigues necesitando realizar tareas como esta entonces te convendría aprender, sino PowerShell entonces como mínimo Visual Basic Script (el cual sería un lenguaje más capacitado que Batch, pero menos que PowerShell), y esos meses que has pasado "atascado" en Batch probablemente habrían sido unas pocas horas o unos cuantos dias en uno de esos lenguajes...
que me indiques como hago uso de lo que propones, quiero decir... copio el código lo pego en un archivo de texto y que extensión debo ponerle.
Si te fijas bien en mi comentario, justo arriba del bloque de código escribí "script.ps1", pues bien, ese "ps1" hace referencia a la extensión del archivo. Si, simplemente copia y pega el código en un archivo de texto y lo guardas con extensión "ps1".
En esta linea especificarías la ruta del archivo de origen (el archivo que contiene el texto "Perl="):
Citar
Código
$srcFilePath = ".\Iput Text.txt"
En esta linea especificarías la ruta del archivo de destino, es decir, el archivo donde se van a escribir el texto con los cambios/reemplazamientos hechos:
Citar
Código
$dstFilePath = ".\Output Text.txt"
Esta linea no creo que necesites modificarla, y además creo que habla por si sola... el primer argumento de la función "Replace" es el texto a reemplazar ("Perl="), y el segundo argumento es el texto por el cual será reemplazado ("HT"):
Citar
Código
$replacedText = ($filecontent).Replace("Perl=", "HT")
¿Cómo utilizar el archivo/script?, pues sencillamente haciendo click derehcho sobre el archivo -> Ejecutar con PowerShell. O bien puedes abrir una instancia de la consola de Windows (CMD.exe) para iniciar la consola de Powershell tal que así:
Código
algún enlace donde poder iniciarme en Power Shell
¿Cómo llevas el dominio del idioma Inglés?, la mayor fuente de documentación así como guías/tutoriales de introducción para iniciarse en el lenguaje y basicamente todo lo que necesitas aprender al respecto (incluyendo porsupuestísimo la referencia de los miembros del lenguaje al completo) lo puedes encontrar en la famosa web MSDN.com de Microsoft y la nueva docs.microsoft.com, eso sí, en perfecto Inglés:
- https://docs.microsoft.com/en-us/powershell/
- https://msdn.microsoft.com/en-us/library/ms714469%28v=vs.85%29.aspx?
Muchos artículos tanto en la MSDN como en docs.microsoft.com están en Castellano, tan solo tienes que modificar la dirección URL para reemplazar la localización del idioma "en-us" por "es-es", por ejemplo:
- https://docs.microsoft.com/en-us/powershell/scripting/getting-started/getting-started-with-windows-powershell?view=powershell-5.1
- https://docs.microsoft.com/es-es/powershell/scripting/getting-started/getting-started-with-windows-powershell?view=powershell-5.1
Y luego en la galería de códigos de Technet puedes encontrar pues... eso, muchos scripts de programadores profesionales de PowerShell que puedes descargar para aprender analizando el código fuente:
( la gran mayoría de scripts que encontrarás ahí están enfocados a la administración web puesto que el propósito de utilización principal del lenguaje Powershell es la administración de servidores web, por otro lado Batch / CMD es un simple instrumento desarrollado con el único propósito de cubrir una interoperabilidad muy básica por no decir cutre, pobre e INUTIL entre el usuario y la shell de Windows, ofreciendo así la posibilidad de poder llevar a cabo tareas básicas (insisto en lo de BÄSICAS, muy, muy básicas, por que es así, Batch no da para más) de administración del sistema operativo y sistema de archivos en general; eso no quita que puedas y debas usar Powershell como reemplazamiento del antiguo Batch y cubrir todas esas cosas que en Batch resultarían muy tediosas o engorrosas de llevar a cabo. )
Bueno, creo que para variar he escrito un monólogo demasiado extenso... lo siento, pero no me gusta dejarme ningún detalle importante sin su debida aclaración.
Un saludo.