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
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.
- Compartir respuesta