Acciones sobre archivos de texto. [Batch]

Iniciado por leogtz, 24 Enero 2009, 00:30 AM

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

leogtz

#290
@vicox19

Claro, solo se necesita lo siguiente:


  • Un ejemplo claro del archivo de entrada (el archivo donde quieres que se reemplace, se necesita para saber qué podemos modificar y que no).
  • El o los nombres de los archivos donde quieres que se realice el reemplazo.
  • Que especifiques claramente qué es lo que quieres que se reemplace.
  • Finalmente, un archivo de salida de ejemplo, es decir, el cómo quisieras que quedara.

Se necesita que especifiques eso claramente para empezar a trabajar. Sé que quizás ya lo has hecho anteriorente, pero no encuentro claro tu mensaje, así que por favor corrigelo.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

vicox19

ok, tratare de ser mas especifico.
archivo que quiero que se modifique:
city1.txt
contenido:
.....codigo......
##Other Properties
#
zipFileSourcePath=\\server1\BuildArchive\1.01\build_1.01.20.zip
.....codigo......

como este archivo tengo de 10 ciudades diferentes. city2, city3....city10

lo que quiero es que al correr el batch me pregunte:
CUAL ES LA VERSION DEL NUEVO BUILD DE HOY?:

yo inserte: 1.01.21

ese NUEVO numero tiene que ser reemplazado en los 10 archivos SOLO la parte del numero. osea, lo que espero que es que el city1.txt termine asi:
.....codigo......
##Other Properties
#
zipFileSourcePath=\\server1\BuildArchive\1.01\build_1.01.21.zip
.....codigo......

y haga lo mismo en los otros 10 archivos city2.txt, city3.txt.....city10.txt

leogtz

#292
Bien, hice esto rápido.

Hice una carpeta con los siguientes archivos:

archivo1.txt
archivo10.txt
archivo2.txt
archivo3.txt
archivo4.txt
archivo5.txt
archivo6.txt
archivo7.txt
archivo8.txt
archivo9.txt


El interior del archivo de cada uno es el siguiente:

archivo1.txt:

.....codigo......    
##Other Properties    
#    
zipFileSourcePath=\\server1\BuildArchive\1.01\build_563456.zip
.....codigo......    


Y así para todos.

El código del batch es el siguiente:

@echo off

setlocal enabledelayedexpansion

rem Cambiar lo siguiente por la ruta de tus archivos
rem Por ejemplo: c:\instaladores
set "instaladores_path=.\instaladores"

:prompt
set /p "build_version=Cual es la versión del build actual? "
if "!build_version!"=="" (goto:prompt)

for /f "tokens=*" %%_ in ('dir /b "!instaladores_path!\*.txt"') do (
   for /f "tokens=*" %%s in ('type "!instaladores_path!\%%_"') do (
       echo %%s | find "zipFileSourcePath" > nul 2>&1 && (
           for /f "tokens=1,2 delims=_" %%# in ('echo %%s') do (
               echo %%#_!build_version!.zip >> "!instaladores_path!\temp_%%_"
           )
       ) || (
           echo %%s >> "!instaladores_path!\temp_%%_"
       )
   )
   copy /y "!instaladores_path!\temp_%%_" "!instaladores_path!\%%_"
   del "!instaladores_path!\temp_%%_"
)


Esta es una corrida y lo que realiza sobre un archivo:


C:\Users\Leo\Desktop\Baúl\Batch>code.cmd
Cual es la versi├│n del build actual? 1.2.3.4.56
        1 archivo(s) copiado(s).
        1 archivo(s) copiado(s).
        1 archivo(s) copiado(s).
        1 archivo(s) copiado(s).
        1 archivo(s) copiado(s).
        1 archivo(s) copiado(s).
        1 archivo(s) copiado(s).
        1 archivo(s) copiado(s).
        1 archivo(s) copiado(s).
        1 archivo(s) copiado(s).

C:\Users\Leo\Desktop\Baúl\Batch>


Salida de los archivos:


C:\Users\Leo\Desktop\Baúl\Batch>type instaladores\archivo1.txt instaladores\archivo2.txt

instaladores\archivo1.txt


.....codigo......
##Other Properties
#
zipFileSourcePath=\\server1\BuildArchive\1.01\build_1.2.3.4.56.zip
.....codigo......

instaladores\archivo2.txt

.....codigo......
##Other Properties
#
zipFileSourcePath=\\server1\BuildArchive\1.01\build_1.2.3.4.56.zip
.....codigo......

C:\Users\Leo\Desktop\Baúl\Batch>


Antes de probarlo realiza un respaldo de los archivos donde vas a hacer el reemplazo. Usalo bajo tu propio riesgo.

Advertencia:

El código batch se basa en la línea que comienza:
zipFileSourcePath=\\server1\BuildArchive\1.01\build_1.2.3.4.56.zip
Para que el código funcione correctamente en la línea anteriormente solo debe de haber un caracter '_', que es el separa zipFileSource... de build_, si hay una más el código quizás no funcione.

Así que procura que solo haya el que está enseguida de build_.

Saludos.  >:D
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

vicox19

 :xD yeah!!!
si funciona!! eres un genio.
si hace el cambio en el numero de version, pero me sale un error de comando SWIFT y tuve que cambiar la variable que definiste por que no reconocia:
de: set "instaladores_path=.\instaladores"
a:   set "instaladores_path=C:\instaladores"

pero a pesar del error si hace el cambio de version. quizas se deba a mi version de windows? win7 o nose... corrida:

C:\instaladores>test.bat

Cual es la versi≤n del build actual? 10.00.00.1188

'Swift' is not recognized as an internal or external command,
operable program or batch file.
        1 file(s) copied.
'Swift' is not recognized as an internal or external command,
operable program or batch file.
        1 file(s) copied.
'Swift' is not recognized as an internal or external command,
operable program or batch file.
        1 file(s) copied.
'Swift' is not recognized as an internal or external command,
operable program or batch file.
        1 file(s) copied.
'Swift' is not recognized as an internal or external command,
operable program or batch file.
        1 file(s) copied.

y si no es mucha molestia. supongo que sobre el mismo codigo se puede modificar algo para lograr lo siguiente.

una vez que actualizo las versiones y lanzo los instaladores UNO POR UNO, a veces falla el instalador. cuando falla tengo que abrir el mismo archivo y cambiar un setting:
de: failOnSQLError=true
a:  failOnSQLError=false

y volver a lanzar para que esta vez A PESAR DEL ERROR instale el programa.
Basicamente lo mismo del anterior caso solo que es en otra parte dentro el archivo donde se hace el cambio a FALSE.

MIL GRACIAS DE ANTEMANO!
me ayudaste a optimizar de gran manera mi trabajo, por que si me olvidaba cambiar la version de un archivo y lanzaba el instalador con un build anterior, era todo un problema jeje, y esto es TODOS LOS DIAS  :P

leogtz

Coloca por favor el batch que utilizaste con las últimas modificaciones, para ver si localizo el error.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

vicox19

#295
@echo off

setlocal enabledelayedexpansion

rem Cambiar lo siguiente por la ruta de tus archivos
rem Por ejemplo: c:\instaladores
set "instaladores_path=C:\instaladores"

:prompt
set /p "build_version=Cual es la versión del build actual? "
if "!build_version!"=="" (goto:prompt)

for /f "tokens=*" %%_ in ('dir /b "!instaladores_path!\*.txt"') do (
   for /f "tokens=*" %%s in ('type "!instaladores_path!\%%_"') do (
       echo %%s | find "zipFileSourcePath" > nul 2>&1 && (
           for /f "tokens=1,2 delims=_" %%# in ('echo %%s') do (
               echo %%#_!build_version!.zip >> "!instaladores_path!\temp_%%_"
           )
       ) || (
           echo %%s >> "!instaladores_path!\temp_%%_"
       )
   )
   copy /y "!instaladores_path!\temp_%%_" "!instaladores_path!\%%_"
   del "!instaladores_path!\temp_%%_"
)

leogtz

@vicox19

¿Cómo lanzas un instalador? Deja por favor un ejemplo.

Citaruna vez que actualizo las versiones y lanzo los instaladores UNO POR UNO, a veces falla el instalador. cuando falla tengo que abrir el mismo archivo y cambiar un setting:
de: failOnSQLError=true
a:  failOnSQLError=false

¿Con abrir el mismo archivo te refieres al archivo al cuál se le ha modificado la versión?

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

vicox19

este es el proceso completo:
en mi folder instaladores tengo:
archivo1.txt
archivo1.bat
archivo10.txt
archivo10.bat
archivo2.txt
archivo2.bat
.....(1 bat para cada TXT)

los archivos .bat basicamente lo que hacen es ejecutar el instalador indicando que lea la configuracion definida en archivo.txt correspondiente. Obviamente el archivo de configuracion tiene muchas cosas, pero a mi solo me interesa trabajar en los 2 campos que te explico abajo.

entonces, como cada dia sale un nuevo bulid, tengo que abrir el archivo de config del instalador y cambiar a la version del nuevo build.

.....codigo......
##General Properties
failOnSQLError=true
.....codigo......     
##Other Properties     
#     
zipFileSourcePath=\\server1\BuildArchive\1.01\build_563456.zip
.....codigo......

con el primer codigo que hiciste TODO OK, el numero de version cambia.

en caso de que la instalacion falle, tengo que volver a abrir el archivo de configuracion y cambiar un valor a FALSE, ya no la version, solo cambiar el FailOnSqlError a FALSE (por eos quisiera que sea un archivo aparte por que NO siempre falla el build.)

.....codigo......
##General Properties
failOnSQLError=FALSE
.....codigo......     
##Other Properties     
#     
zipFileSourcePath=\\server1\BuildArchive\1.01\build_563456.zip
.....codigo......

una vez que esta en FALSE tengo que volver a lanzar el instalador pero esta vez NO fallara por que el FALSE que pusimos. Una vez que termine el proceso de instalacion, tengo que volver a poner a TRUE el setting para repetir al dia siguiente el proceso. Esta ultima parte de poner de FALSE a TRUE simplemente seria editar el batch que sirva para cambiar de TRUE a FALSE.

en resumen, necesitaria 3 batch:
1. para cambiar la version (OK)
2. para cambiar de failOnSQLError=TRUE a failOnSQLError=FALSE
3. para cambiar de failOnSQLError=FALSE a failOnSQLError=TRUE (similar al 2 invirtiendo las opciones)

sabeeee

"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon

Rikosky

Como se podria insertar una linea de texto al principio de un .txt?

echo %text23%>>Accesos.txt

Lo mismo que se haria con ese codigo, pero insertando la linea al principio y no al final, de forma que lo mas reciente este arriba y no al final del texto.