Necesito reescribir un documento en la línea por con una script batch

Necesito un código para reescribir un documento, es decir yo tengo por ejemplo un script que me crea otro script mediante el comando ">"

@echo off
::Ejemplo
set variable1=cosa1
set variable2=cosa2
set variable3=cosa3
[y aqui iria mas codigo]

Entonces si fuera necesario quiero poder cambiar la variable 3 por ejemplo accediendo desde el primer script sin necesidad de tener que reescribir todo el bat de nuevo. No se si me he explicado... Porque si uso el comando ">>" me la pondría en la ultima línea del documento y no me interesa.

1 respuesta

Respuesta

No te entiendo bien. Entiendo que tienes un primer BAT que crea un segundo BAT (supongo que luego se lanza ese segundo BAT bien con START o con CALL). Supongo que el esbozo que presentas corresponde al primer BAT. Intuyo que lo que quieres es otro BAT que modifique una parte del segundo BAT en lugar de crearlo de nuevo, pero si fuera así parece que lo más razonable es editar directamente este segundo BAT.

Digamos que lo que expuse es el esbozo del segundo bat. (que en realidad seria este que expongo a continuación de este párrafo) en realidad es un control de edades, digamos que en mi proyecto el programa tiene registrado una serie de "usuarios" en distintos archivos bat y a partir de esos bat (que básicamente son variables con el nombre, la fecha de nacimiento, etc...) cuando se registran a los usuarios automáticamente aparte de todos los demás bat de control se crea este bat:

set nomCompleto=xxxxxxx 
set fechNac=05-10-1986
set code=M001
set ed=%fechNac%
set edad=35
set numUsu=1
set anio2=%ed:~6,4%
set mes2=%ed:~3,2%
set dia2=%ed:~0,2%
if %dia2% leq 9 ( set diaNac=%dia2:~1,1%) 
if %dia2% gtr 9 ( set diaNac=%dia2%) 
if %mes2% leq 9 ( set mesNac=%mes2:~1,1%)  
if %mes2% gtr 9 ( set mesNac=%mes2%)  
set /a anio=%anio1% - %anio2%  
set /a mes=%mesActu% - %mesNac%  
set /a dia=%diaActu% - %diaNac%  
if %mes% equ 0 ( if %dia% equ 0 ( set EDA=%anio%))  
if %mes% equ 0 ( if %dia% lss 0 ( set /a EDA=%anio% - %u%))  
if %mes% lss 0 ( set /a EDA=%anio% - %u%) 
if %EDA% neq %edad% ( call edadMAS.bat) 
:Sig_1 
if %numUsu% equ %numUs% ( call salir.bat ) 

(el salir.bat simplemente es un bat que llama al start.bat que seria el bat que inicia el programa)

y este bat ( el que te muestro a continuacion de este parrafo) sirve para que cuando se inicie el programa antes de empezar (el start.bat) si alguien a cumplido años manda un aviso( tal persona a cumplido tal edad). Cual es el problema, que si te fijas el set "edad=16" , si da la casualidad que es el cumpleaños , si no consigo cambiar  el "set edad=35" ha 36, en este caso pues al día siguiente me volvería a saltar que cumplió años y así de manera infinita.... Entonces necesito de alguna manera si salta que cumplió años, meter algún código con el bat principal (que seria el start.bat) para que cambie el set edad y le sume 1, así ya no volvería a salir el mensaje de que ha cumplido edad. Lo único que se me ocurre es meter muchísimo código para que de nuevo se cree este bat entero cambiando la variable edad... pero me supondría mucho lio en el código de todos los bat que están enlazados para que funcione el programa. Por ejemplo:

@echo off
title  CONTRL EDADES
call num_cntrlEdad.bat <--( eso seria un bat con un set y el numero de usuarios total)
set u=1
set anio1=%date:~6,4%
set mes1=%date:~3,2%
set dia1=%date:~0,2%
if %mes1% leq 9 ( set mesActu=%mes1:~1,1%) else ( set mesActu=%mes1%)
if %dia1% leq 9 ( set diaActu=%dia1:~1,1%) else ( set diaActu=%dia1%)
if not exist si.txt ( cd..&cd..&call start.bat ) <--(esto es por si aun no se a registrado ningun usuario pues que se habra el menu inicial directamente)
echo.
echo =============================================================
echo VAMOS A COMPROBAR SI HA CAMBIADO LA EDAD DE ALGUIEN !
echo =============================================================
echo.
goto check
:check
pause
if exist 1_cntrlEdad.bat ( call 1_cntrlEdad.bat ) <--(cada ves que se registra un usuario se crea este bat 
                                                       que es el que necesito modificar si cumple años.)
if exist 2_cntrlEdad.bat ( call 2_cntrlEdad.bat ) 
if exist 3_cntrlEdad.bat ( call 3_cntrlEdad.bat ) 
if exist 4_cntrlEdad.bat ( call 4_cntrlEdad.bat ) 
if exist 5_cntrlEdad.bat ( call 5_cntrlEdad.bat ) 
if exist 6_cntrlEdad.bat ( call 6_cntrlEdad.bat ) 
if exist 7_cntrlEdad.bat ( call 7_cntrlEdad.bat ) 
if exist 8_cntrlEdad.bat ( call 8_cntrlEdad.bat ) 
if exist 9_cntrlEdad.bat ( call 9_cntrlEdad.bat ) 
if exist 10_cntrlEdad.bat ( call 10_cntrlEdad.bat ) 
if exist 11_cntrlEdad.bat ( call 11_cntrlEdad.bat ) 
if exist 12_cntrlEdad.bat ( call 12_cntrlEdad.bat ) 
if exist 13_cntrlEdad.bat ( call 13_cntrlEdad.bat ) 
if exist 14_cntrlEdad.bat ( call 14_cntrlEdad.bat ) 
if exist 15_cntrlEdad.bat ( call 15_cntrlEdad.bat ) 
if exist 16_cntrlEdad.bat ( call 16_cntrlEdad.bat ) 
if exist 17_cntrlEdad.bat ( call 17_cntrlEdad.bat ) 

Por ahora, lo que me consigo imaginar aplicando la lógica es que si alguien cumple edad , automaticamente en el bat siguiente que te muestro (que seria el que manda la alerta) lanzar otro bat para que cuando me abra el start.bat primero haga eso de cambiar los "set edad":

echo ATT: %nomCompleto%  ha cumplido %EDA% anios!
echo.
pause 
if %numUSu% neq %numUs% ( goto sig_%numUsu% ) <-- Esto seria lo que controla si tiene que seguir revisando edades o no
if %numUSu%==%numUs% ( cd..&cd.. ) 
if %numUSu%==%numUs%  ( call start.bat) <-- "start.bat" es el bat que inicia el "verdadero programa"

ufff... espero haberme explicado! Gracias de ante mano por tu TIEMPO!

Me resulta muy complejo lo que cuentas y no consigo hacerme una idea "operativa". Solo se me ocurre que para determinar que hoy es el cumpleaños de alguien basta con comparar la fecha de hoy (solo dia/mes) con la fecha de nacimiento (solo dia/mes) de ese alguien. Con esto ya no tendrías el problema de que mañana volviera a dar la alerta de cumpleaños.

Si quieres que entre más a fondo en tus BATs necesitaría un ejemplo global, con todos los BAT involucrados aunque fuera para una sola persona

Creo que eso que me comentas no funcionaria, (corrígeme si me equivoco porque la dislexia aveces me cuesta el doble aplicar la lógica es un reto esto de programar para mi ) porque no sabemos si se va a entrar todos los días, entonces si entra dos días después de su cumpleaños no avisaría de que hay que cambiar la edad, porque lo que necesito es que avise para que se sea consciente de que la edad de un usuario a cambiado y por consecuente cambiar la edad en los documentos oportunos... voy a intentar pasarte partes del código de los distintos bat a ver si eres capaz de hacerte una idea, lo intente anoche... pero me pareció una tarea muy laboriosa porque son demasiados bat jejejeje, pero pensado voy a ponerte parte del código de cada bat lo que es para esa parte de las edades. Te adelanto ya que antes de cerrar la pregunta me digas como puedo darte la máxima puntuación, para que no me pase lo que la ultima vez que no supe valorarte bien, yo soy el muchacho que ya ayudaste hace unos meses, el que estaba haciendo un bat ha su pareja para controlar las citas... je je desaparecí porque tuve una serie de problemas y no se me asuste con lo ingenuo que fui al publicar los bat por aquí sin modificarlos para que no aparecía toda la información personal y bueno me emparanoye y tuve miedo al ver que ya no podía hacer nada por borrar lo aquí expuesto y desaparecí de las redes por un tiempo. Pero desde aquel entonces he avanzado en programación y gracias a ti je je en ms-dos diría que tengo un nivel casi básico ( solo me falta por entender los jodidos bucles FOR ) y he aprendido un poco de javascript y de pyton y curiosamente en javascript y en pyton me defiendo con los for pero en ms-dos no hay manera! Mi intuición me dice que con un bucle for manejando los tokens que se supone que son las líneas, que en este caso es la línea 5 del bat que necesito modificar la edad, podría sustituir esa línea por otra pero no me aclaro después de investigar y buscar, y la verdad que en cuanto a bucles for de ms-dos hay muy poca información y la verdad que en la ayuda que sale en la consola pues no me aclaro. Pero de entrada decirte que estoy muy agradecido de tu ayuda porque me ayudaste y me motivaste a seguir esta aventura de la programación.

Voy a intentar poner parte de los bat !

@echo off
title gtt
color 06
(aquí es donde creo que tengo que insertar código nuevo para cambiar 
los set edad)
set e=nulo
:inicio
set pass=
cls 
color 06
echo ********************************************************************
echo ====================================================================
echo     REVISAR TAREAS 
echo.
echo = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
echo.
echo  Quien eres AAA o BBB?
echo.
set /p pass=[1.AAA  2.BBB  3.Otra Persona]: 
if defined pass ( set pass=%pass: =_%)
if not defined pass ( echo Porfavor Identificate) & ( echo.&pause ) & ( call :inicio )
if %pass% neq 1 ( if %pass% neq 2 ( if %pass% neq 3 (set e=1&goto error)))
if %pass% equ 1 ( call :AAA )
if %pass% equ 2 ( call :BBB )
if %pass% equ 3 ( call :desconocida )
:AAA
cls 
color 06
echo ********************************************************************
echo ====================================================================
echo                 REVISAR TAREAS 
echo.
echo = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
echo.
echo.
echo.
set /p password=?: 
echo.
if %password% neq 000 (echo ACCESO DENEGADO.) & (echo.&pause) & ( call :inicio )
echo ============================ 
echo    "Bienvenida AAA =)"
echo ============================
(
    echo set nombreT=AAA
    echo set hora=%time:~0,5%) >cntrl_acces.bat
set nom=1
echo.
pause
goto saludo 
:BBB
cls 
color 06
echo ********************************************************************
echo ====================================================================
echo     REVISAR TAREAS 
echo.
echo = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
echo.
echo. 
echo.
set /p password=?: 
echo.
if %password% neq 000 (echo ACCESO DENEGADO.) & (echo.&pause) & ( call :inicio )
echo ============================ 
echo    "Bienvenida BBB =)"
echo ============================
(
    echo set nombreT=BBB
    echo set hora=%time:~0,5%) >cntrl_acces.bat
set nom=2
echo.
pause
goto saludo
:desconocida
cls 
color 06
echo ********************************************************************
echo ====================================================================
echo     REVISAR TAREAS 
echo.
echo = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
echo.
echo  Introduce tu nombre:
echo.
set /p password=?: 
echo.
echo ============================ 
echo  "Bienvenida %password% =)"
echo ============================
(
    echo set nombreT=%password%
    echo echo set hora=%time:~0,5%) >cntrl_acces.bat
set nom=%password%
echo.
pause
:saludo 
(Aquí va una serie de código para generar unos saludos según la hora del dia) 
cls
color 06
echo ********************************************************************
echo ====================================================================
echo      REVISAR TAREAS
echo.
echo = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
echo          HOY ES DIA: %date% Y SON LAS  %time:~0,5% HORAS
echo.
echo      %saludo% ; %saludo2%
echo = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
echo.
if %nom%==2 ( echo     Te quiero nos vemos %muak% muak! )
:menu_principal
if %e%==0 (
cls
color 06
echo ********************************************************************
echo ====================================================================
echo      REVISAR 
echo.
echo = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
echo             HOY ES DIA: %date% Y SON LAS  %time:~0,5% HORAS )
echo ====================================================================
echo.
echo                        * MENU PRINCIPAL *
echo.
echo ====================================================================
echo.
echo                   1.-------------------
echo.
echo                   2.-------------------
echo. 
echo                   3.---------------------
echo.
echo                   4.Revisar cosas pendientes
echo.
echo                   5.Crear Fichas
echo.
echo                   6.---------------------
echo.
echo =====================================================================
echo *********************************************************************
echo.
goto 000
:err_00
set ob=
:000
set /p ob=Introduce Caracter Numerico Correspondiente: 
if not defined ob (echo ATT:NO HAS INTRODUCIDO NINGUN CARACTER) & ( goto err_00 )
if defined ob (set ob=%ob: =_%)
if %ob% neq 1 ( if %ob% neq 2 ( if %ob% neq 3 ( if %ob% neq 4 ( if %ob% neq 5 ( if %ob% neq 5 ( set e=0&call :error))))))
if %ob% equ 1 ( call :ob1 )
if %ob% equ 2 ( call :ob2 )
if %ob% equ 3 ( call :ob3 )
if %ob% equ 4 ( call :ob4 )
if %ob% equ 5 ( call :ob5 )
if %on% equ 6 ( call :ob6 )
(bueno y aqui abajo iria el codigo 
con las llamadas pertinentes a cada bat del menu
pero vamos a centrarnos en el :ob5 que es lo
que nos atañe)
:ob5
call crearFichas.bat
pause
exit

vale este bat seria el bat que se llama start.bat

El siguiente bat el de crearFichas.bat  que primero contrla de que grupo es porque hay dos grupos de personas digamos y simplemente es un bat que con una seria de set /p va recopilando una serie  de datos (nombre, apellidos , fecha de nacimiento, etc...) y despues las pongo los set en un documento que se va numerando por ejemplo de un grupo el primero que registra seria el m001 y del otro grupo el primero que registra seria M001 y los bat que almacenan estos set con los datos pues se llaman m001.bat y asi sucesivamente...

y como la ficha en si seria la misma para cada grupo después llama a otro bat que seria plantilla_fichas_us.bat que parte del código final es que que te voy a mostrar ahora:

(aqui arriba iria un codigo que lo que hace es llamar al bat m001.bat por ejemplo 
y rellenar un documento mediante el comando ">" o ">>") 
y aqui viene la parte interesante que seria el final del bat plantilla:
cd..&cd..
cd cntrl_edad  <-- (aqui entramos en la carpeta que controla especificamente los mensajes estos que te digo)
call num_cntrlEdad.bat <--(aqui llamo a un set /a que va controlando el numero total de usuarios registrados da igual de que grupo sean)
set /a numUs+=1  <--( aqui le sumamos 1 a esa variable)
(echo set numUs=%numUs%) >num_cntrlEdad.bat <--(y aqui la modificamos en el bat original)
(echo.) >si.txt <--(esto es para que si no se ha registrado a nadie pues directamente inicie el start.bat)
(
    echo set nomCompleto=%nom% %ape1% %ape2%
    echo set fechNac=%fechNac%
    echo set code=%num%
    echo set ed=%%fechNac%%
    echo set edad=%edad%
    echo set numUsu=%numUs%) >%numUs%_cntrlEdad.bat <--(aqui se crea el documento especifico de cada usuario que controla la edad con los datos basicos)
    echo if exist %numUs%_cntrlEdad.bat ( call %numUs%_cntrlEdad.bat ) >>cntrl_edad.bat
set numUsu=%numUs%
<(y ahora a conticuacion despues de los datos basicos le meto el codigo que cuando se ejecuta hace el calculo)
    (echo set anio2=%%ed:~6,4%%) >>%numUs%_cntrlEdad.bat 
    (echo set mes2=%%ed:~3,2%%) >>%numUs%_cntrlEdad.bat
    (echo set dia2=%%ed:~0,2%%) >>%numUs%_cntrlEdad.bat
    echo if %%dia2%% leq 9 ( set diaNac=%%dia2:~1,1%%) >>%numUs%_cntrlEdad.bat
    echo if %%dia2%% gtr 9 ( set diaNac=%%dia2%%) >>%numUs%_cntrlEdad.bat
    echo if %%mes2%% leq 9 ( set mesNac=%%mes2:~1,1%%) >>%numUs%_cntrlEdad.bat 
    echo if %%mes2%% gtr 9 ( set mesNac=%%mes2%%)  >>%numUs%_cntrlEdad.bat
    echo set /a anio=%%anio1%% - %%anio2%%  >>%numUs%_cntrlEdad.bat
    echo set /a mes=%%mesActu%% - %%mesNac%%  >>%numUs%_cntrlEdad.bat
    echo set /a dia=%%diaActu%% - %%diaNac%%  >>%numUs%_cntrlEdad.bat
    echo if %%mes%% equ 0 ( if %%dia%% equ 0 ( set EDA=%%anio%%))  >>%numUs%_cntrlEdad.bat
    echo if %%mes%% equ 0 ( if %%dia%% lss 0 ( set /a EDA=%%anio%% - %%u%%))  >>%numUs%_cntrlEdad.bat
    echo if %%mes%% lss 0 ( set /a EDA=%%anio%% - %%u%%) >>%numUs%_cntrlEdad.bat
    echo if %%EDA%% neq %%edad%% ( call edadMAS.bat) >>%numUs%_cntrlEdad.bat
    (echo :Sig_%numUsu% )>>%numUs%_cntrlEdad.bat
    echo if %%numUsu%% equ %%numUs%% ( call salir.bat ) >>%numUs%_cntrlEdad.bat
cd..&cd..
:menu_final_fichas
cls
color 06
echo ********************************************************************
echo ====================================================================
echo             CREAR FICHAS
echo.
echo = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
echo          HOY ES DIA: %date% Y SON LAS  %time:~0,5% HORAS
echo.
echo ====================================================================
echo                                      APARTADO: GRUPO %group%  
echo ====================================================================
echo.
echo              Que quieres hacer a continuacion?:
echo.
echo           ----------------------------------------
echo           -        1.Crear ficha M....          -
echo           -                                      -
echo           -        2.Crear otra ficha desde 0    -
echo           -                                      -
echo           -        3.Ir al menu principal        -
echo           ----------------------------------------

Uy se me olvido señalarte

cd..&cd..
cd cntrl_edad  
call num_cntrlEdad.bat 
set /a numUs+=1 
(echo set numUs=%numUs%) >num_cntrlEdad.bat
(echo.) >si.txt
(
    echo set nomCompleto=%nom% %ape1% %ape2%
    echo set fechNac=%fechNac%
    echo set code=%num%
    echo set ed=%%fechNac%%
    echo set edad=%edad%
    echo set numUsu=%numUs%) >%numUs%_cntrlEdad.bat
    echo if exist %numUs%_cntrlEdad.bat ( call %numUs%_cntrlEdad.bat ) >>cntrl_edad.bat (AQUI EN EL BAT DE CONTROL DE EDAD
LE MANDO A INSTERTAR LA LINEA PARA QUE LLAME AL BAT QUE ESTAMOS CREADO, Y USO UN IF EXIST 
PORQUE ME IMAGINO QUE SI SE LE DA DE BAJA A ESE USUARIO YA NO EXISTIRÍA
Y POR CONSECUENTE NO LO LLAMARÍA MAS) 
-------------------------------------------------------------
set numUsu=%numUs%
    (echo set anio2=%%ed:~6,4%%) >>%numUs%_cntrlEdad.bat
    (echo set mes2=%%ed:~3,2%%) >>%numUs%_cntrlEdad.bat
    (echo set dia2=%%ed:~0,2%%) >>%numUs%_cntrlEdad.bat
    echo if %%dia2%% leq 9 ( set diaNac=%%dia2:~1,1%%) >>%numUs%_cntrlEdad.bat
    echo if %%dia2%% gtr 9 ( set diaNac=%%dia2%%) >>%numUs%_cntrlEdad.bat
    echo if %%mes2%% leq 9 ( set mesNac=%%mes2:~1,1%%) >>%numUs%_cntrlEdad.bat 
    echo if %%mes2%% gtr 9 ( set mesNac=%%mes2%%)  >>%numUs%_cntrlEdad.bat
    echo set /a anio=%%anio1%% - %%anio2%%  >>%numUs%_cntrlEdad.bat
    echo set /a mes=%%mesActu%% - %%mesNac%%  >>%numUs%_cntrlEdad.bat
    echo set /a dia=%%diaActu%% - %%diaNac%%  >>%numUs%_cntrlEdad.bat
    echo if %%mes%% equ 0 ( if %%dia%% equ 0 ( set EDA=%%anio%%))  >>%numUs%_cntrlEdad.bat
    echo if %%mes%% equ 0 ( if %%dia%% lss 0 ( set /a EDA=%%anio%% - %%u%%))  >>%numUs%_cntrlEdad.bat
    echo if %%mes%% lss 0 ( set /a EDA=%%anio%% - %%u%%) >>%numUs%_cntrlEdad.bat
    echo if %%EDA%% neq %%edad%% ( call edadMAS.bat) >>%numUs%_cntrlEdad.bat
    (echo :Sig_%numUsu% )>>%numUs%_cntrlEdad.bat
    echo if %%numUsu%% equ %%numUs%% ( call salir.bat ) >>%numUs%_cntrlEdad.bat
cd..&cd..

entoces el bat que se llama cntrl_edades.bat lo tienes en el segundo mensaje y solo me faltaria por ponerte dos bat pequeños mas que tuve que crear porque me daba fallo  y de esta manera no, uno seria el que se llama cuando el codigo dice que la edad a cambiado que seria el edadMas.bat

title edadMAS.bat
echo ATT: %nomCompleto%  ha cumplido %EDA% anios!
echo.
pause 
if %numUSu% neq %numUs% ( goto sig_%numUsu% ) 
if %numUSu%==%numUs% ( cd..&cd.. ) 
if %numUSu%==%numUs%  ( call start.bat)

y el bat que se llama salir.bat

cd..&cd..
call start.bat
pause
exit

y esta seria la carpeta especifica del programa que hace el control de edades

hay en la foto pues se ven como se numeran a los usuarios independientemente del grupo que sean

¡Dios mío! (O "My God!"). No sé si me atreveré a meterme a fondo. De momento voy a seguir por las ramas.

Comprendo tu objeción respecto a que si no se "entra" el día del cumpleaños no se cambia la edad. Lo que no acabo de entender es por qué se mantiene una variable/campo con el parámetro "edad" si es un valor que se puede calcular en cualquier momento a partir de la fecha de nacimiento y la fecha actual.

Respecto al FOR de MSDOS puedo intentar explicarte lo que necesites. Para empezar te diré que en el FOR /F (la forma más usada, creo, del FOR) se trata el contenido del archivo línea a línea, de modo que los TOKENS no son las líneas sino los campos a tratar, dentro de los existentes en cada una de las líneas de acuerdo con los delimitadores de campo (DELIMS), y existe el parámetro SKIP (salto) para empezar a tratar líneas a partir de la indicada en el salto

Pues tiene la variable "edad" porque a mi entender una vez que calcula la edad mediante el codiguito ese que tiene cada bat particular de cada usuario osea este:

set nomCompleto=xxxxx
set fechNac=30-07-1994
set code=M001
set ed=%fechNac%
set edad=27 <--(si esto no existiera**)
set numUsu=1
set anio2=%ed:~6,4%
set mes2=%ed:~3,2%
set dia2=%ed:~0,2%
if %dia2% leq 9 ( set diaNac=%dia2:~1,1%) 
if %dia2% gtr 9 ( set diaNac=%dia2%) 
if %mes2% leq 9 ( set mesNac=%mes2:~1,1%)  
if %mes2% gtr 9 ( set mesNac=%mes2%)  
set /a anio=%anio1% - %anio2%  
set /a mes=%mesActu% - %mesNac%  
set /a dia=%diaActu% - %diaNac%  
-----------------------------------------------------------------------
if %mes% equ 0 ( if %dia% equ 0 ( set EDA=%anio%))  
if %mes% equ 0 ( if %dia% lss 0 ( set /a EDA=%anio% - %u%))  
if %mes% lss 0 ( set /a EDA=%anio% - %u%) 
aquí lo que hago básicamente es re calcular constantemente la edad
y si luego sale diferente al parámetro "edad" entonces es cuando 
hacemos CALL al bat pertinente que lanza el aviso
-----------------------------------------------------------------
if %EDA% neq %edad% ( call edadMAS.bat) **<--(esta comparativa no tendria sentido)
:Sig_1 
if %numUsu% equ %numUs% ( call salir.bat ) 
if %mes% equ 0 ( if %dia% equ 0 ( set EDA=%anio%))  
if %mes% equ 0 ( if %dia% lss 0 ( set /a EDA=%anio% - %u%))  
if %mes% lss 0 ( set /a EDA=%anio% - %u%) 
----------------------------------------------------
La única diferencia en los otros bat es que este código quedaría así:
if %mes% equ 0 ( if %dia% equ 0 ( set edad=%anio%))  
if %mes% equ 0 ( if %dia% lss 0 ( set /a edad=%anio% - %u%))  
if %mes% lss 0 ( set /a edad=%anio% - %u%) 
y asi ya el parametro edad se actualiza solo

Digamos que el parámetro "edad" no queda registrado de manera fija en ningún lado del programa salvo en este bat( el de arriba el primero de este mensaje) . por ejemplo en los bat que mantienen los set con los datos personales , que se usaría para llamarlos y rellenar distintos documentos de manera automática o lo que fuera que se necesitaran esos datos, ahí en ese bat no tengo un parámetro fijo con la edad, si no que al final después de  los distintos set con los datos le inserto este código que calcula automáticamente la edad y todos los documentos que se fueran a rellenar  nuevos siempre quedaría actualizada la edad

[aquí en este espacio quería meter el segundo cachito de código pero no me dejo ponerlo aquí y se quedaron los dos códigos unos debajo del otro]

, pero el problema esta en los documentos que ya quedaron rellenos en un pasado y hay que actualizares la edad, entonces para eso mis conocimiento de lógica de programación no me llegan para automatizar eso y por eso lo único que se me ocurrió crear estos bat que controlan la edad y dan un aviso de si alguna edad a cambiado y de manera manual se procedería a cambiar la edad en esos documentos que fuera necesario.

con respecto a los FOR, tengo dos dudas, una es porque con un bucle for /f no me sirve para documentos .odt y supongo que para documentos .doc tampoco, ¿solo sirve para documentos .txt?

y la segunda duda es , entonces ¿se pueden modificar los documentos mediante un ciclo FOR , cambiar una linea de texto por otra?

Respecto a lo primero sigo rehuyendo entrar a fondo porque me temo que me perdería. A lo mejor puedo ayudarte a retocar esos documentos de los que hablas, que intuyo que son, también, BAT (este es uno de los aspectos que no acabo de asimilar de tu "enfoque operativo", normalmente por un lado están los "archivos de programa", sean BAT, EXE, VBS, PRG, etc., y por otro los archivos de datos: TXT, DOC, CSV, DB, XLS, MDB, etc.). Tal vez si me aportas un par de archivos/documentos de ejemplo (el archivo en el que hay que modificar la edad y el archivo del que se pueda sacar la nueva edad) pueda hacer algo.

Respecto al FOR /F, en principio sirve para cualquier tipo de archivo (a veces puede ser necesario ayudarse de un TYPE o utilizar el parámetro USEBACKQ) pero no olvides que la "unidad de tratamiento" es la línea del archivo, es decir las líneas que verías si haces un TYPE directo de ese archivo y eso puede hacer que sea inviable tratar archivos que no sean "planos" (TXT, CSV, INI, XML típicamente). También es cierto que el tamaño máximo de línea tratado por un FOR es de 8191 (algunos XML lo superan), y si se usa sobre un TYPE sería de 4096 que es el tamaño máximo de línea del comando TYPE.

El uso del FOR /F para "editar" archivos es bastante frecuente, pero obliga a ir generando un archivo nuevo en el que se van volcando las líneas que no cambian, se ignoran las que se quieren borrar y se retocan las que se quieren cambiar. El paso final sería reescribir el archivo editado con el archivo auxiliar que se ha ido creando.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas