Intento explicarme mejor con lo del numero no válido! Por si te intereso la historia...
A ver si me explico de una vez entre otras cosa lo que hace el .batch, o lo que pretendo que haga, es que pueda calcular fechas con distintas frecuencias (es decir aveces tiene citas cada 7 días otras cada 15, cada 21, o cada 30 días) y da la opción de calcular a partir de hoy (es decir la fecha del ordenador ) o a partir de una fecha en concreto (puede elegir la fecha y a partir de esa calcular cuando seria la siguiente cita con la frecuencia elegida)
Básicamente lo que hago es primero que nada en el código o script no me queda claro bien la terminología todavía, siempre leo distintas terminologías para cosas iguales o parecidas y me lía bueno voy al lio, es declarar estas variables :
set DIA=%date:~-10,2%
set MES=%date:~-7,2%
set ANO=%date:~-4,4%
set HORAS=%time:~0,2%
set MINUTOS=%time:~3,2%
set FRECUENCIA1=7
set FRECUENCIA2=15
set FRECUENCIA3=21
set FRECUENCIA4=30
Bueno después de eso le hago un menu con un set /p tal que así:
:menu_basico
Echo "1. Registrar Fecha Manualmente"
Echo "2. Registrar Fechas con la Frecuencia deseada"
Echo "3. Ir al gestor de búsqueda y vizualizacion de citas"
set /p elec0= Elige una opcion :
if %elec0%==1 call :Manualmente
if %elec0%==2 call :buscar_fecha_libre
if %elec0%==3 start /max buscador_de_citas.bat & exit
Entonces lo que pretendo es que en el 1 pueda registrar una fecha directamente y el 2 haga las sumas y restas pertinentes para que que de con la fecha exacta
Pues si elige la opción dos que es donde esta teniendo el problema, hago una llamada a un "bucle"(así es mi tecnicismo para llamar yo cada vez que uso un " :lo que sea ", espero a verme expresado XD) bueno pues uso el call para llamar a :buscar_fecha_libre :
-----------------------------------------------------------------------------------------------------------------------
:buscar_fecha_libre
set /p elige= 1.Apartir de Hoy 2.Apartir de una fecha en concreto
if %elige%==1 (call :seguimosmai)
if %elige%==2 (goto :neXt) else (echo opcion inccorrecta )
goto buscar_fecha_libre
:seguimosmai
set elegirDia=%DIA% &set MeS=%MES%
set /p frecuencia=1.semanalmente 2.Cada 15 dias 3.Cada 21 dias 4.Mensualmente
if %frecuencia%==1 (set elegirFrecuencia=%FRECUENCIA1% & goto nexT2)
if %frecuencia%==2 (set elegirFrecuencia=%FRECUENCIA2% & goto nexT2)
if %frecuencia%==3 (set elegirFrecuencia=%FRECUENCIA3% & goto nexT2)
if %frecuencia%==4 (set elegirFrecuencia=%FRECUENCIA4% & goto nexT2) else (echo El numero
no corresponde con niguna frecuencia) & (goto nexT )
:nexT2
set /a resultado_principal=%elegirDia%+%elegirFrecuencia%
Entonces llegados a este punto es donde me falla, pues bien aquí el problema de si la frecuencia se aplica a partir de hoy o a partir de una fecha en concreto lo resolví así, un poco lioso pero es la menos liosa de todas las que probé y funcionan jejej. El caso es que si elige la opción 1 no había dado problema pues porque estamos en el mes 04 y no coincido nunca que saliera como día 08 ni 09 pero probando la opción dos que lo que hago es saltarme todo el proceso de sumar y restar para que de la fecha que queremos que lo dejare al final de esto por si te interesar ver como resolví el problema de sumar y restar fechas, a lo mejor se puede hacer mucho más sencillo jejejej !
Bueno el caso es que eso funciona perfectamente (aunque aun me quedan muchas variables por probar jejejeje así que tan perfectamente no se yo ) pero cuando vamos a la opción dos nos encontramos con esto :
:neXt
set /p F_d=Introduce el dia en numero :
set /p F_m=Introduce el mes en numero :
set MeS=%F_m%
set elegirDia=%F_d%
goto neXt2
:neXt2
set /p frecuencia=1.semanalmente 2.Cada 15 dias 3.Cada 21 dias 4.Mensualmente
if %frecuencia%==1 (set elegirFrecuencia=%FRECUENCIA1% & goto nexT2)
if %frecuencia%==2 (set elegirFrecuencia=%FRECUENCIA2% & goto nexT2)
if %frecuencia%==3 (set elegirFrecuencia=%FRECUENCIA3% & goto nexT2)
if %frecuencia%==4 (set elegirFrecuencia=%FRECUENCIA4% & goto nexT2) else (echo El numero
no corresponde con niguna frecuencia) & (goto neXt2 )
Y lo mando pal principio otra vez osea para esta formulita de acá:
:nexT2
set /a resultado_principal=%elegirDia%+%elegirFrecuencia%
Entonces me dio por probar la frecuencia 2 que seria 15 y como día puse el 09 y como mes el 09
y se vino la catástrofe !
s\citas>set /p F_d=Introduce el dia en numero :
Introduce el dia en numero : 09
\citas>set /p F_m=Introduce el mes en numero :
Introduce el mes en numero :09
\Gestor_de_citas\citas>set MeS=09
\Gestor_de_citas\citas>set elegirDia=09
\Gestor_de_citas\citas>goto neXt2
\Gestor_de_citas\citas>set /p frecuencia=1.semanalmente 2.Cada 15 dias 3.Cada 21 dias 4.Mensualmente
1.semanalmente 2.Cada 15 dias 3.Cada 21 dias 4.Mensualmente2
\Gestor_de_citas\citas>if 2 == 1 (set elegirFrecuencia=7 & goto nexT2 )
\\Gestor_de_citas\citas>if 2 == 2 (set elegirFrecuencia=15 & goto nexT2 )
\Gestor_de_citas\citas>set /a resultado_principal=09+15
Número no válido . Las constantes numéricas son decimales(17),
hexadecimales (0x11), u octales (021).
C:\Gestor_de_citas\citas>echo Esto es un pause para llamar al chequeo y verificar que el resultado principal de la fecha no es superior a "31" & pause1>nul
Esto es un pause para llamar al chequeo y verificar que el resultado principal de la fecha no es superior a "31"
Pues básicamente esto es todo lo que me se explicar, no se que más y parece ser que no me deja escribir más ! Un saludo y muchas gracias por llegar hasta aquí ! Corazoncito para ti ! Muaka!
1 Respuesta
Voy a empezar por el final. Lo que te dice el mensaje es la pista. Para este "lenguaje" resulta que Las constantes numéricas son decimales(17), hexadecimales (0x11) u octales (021). Supongo que sabes qué significa que un número esté representado de forma decimal, hexadecimal u octal. Si no lo sabes puedo intentar explicártelo, pero por lo que cuentas me parece que eres perfectamente capaz de averiguarlo sin ayuda. Este mensaje te está indicando las distintas formas expresar el número 17, en forma decimal, tal cual, (17), en forma hexadecimal, añadiendo el prefijo "0x", (0x11) o en forma octal, añadiendo el prefijo "0", (021). Si expresas un número con el prefijo "0" tiene que ser octal, pero los números en octal solo utilizan las cifras de 0 a 7, por tanto "09" es inconsistente, porque le dices que es octal y sin embargo usas cifras no válidas en octal. Si en lugar de 09 para el día (creo que es el día el que te da el problema) pones 9 verás como desaparece el problema.
Intuyo que esto puede resolverte esta duda/problema, pero que te llevará a otras más. Por aquí estaré, si fuera el caso.
Muchísimas gracias por contestar! je je si la verdad que una vez que publique la pregunta pues soy muy ansioso y llegue a esa misma conclusión entonces empecé a investigar y base de prueba error y con un poco de ayuda de la lógica di con la combinación de números tal que así:
set DIA=%date:~1,1%
set MES=%date:~4,1%
y al final para que me salga la fecha pues le hago pasar por esto:
if %D_A% LSS %qwe% (call :ses) else ( set DDD=%D_A%)
:sis
if %M_A% LSS %qwe% (call :ses1) else (set MMM=%M_A%)
:sus
echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ----------------
pause>nul
set fechasMUL=%DDD%-%MMM%-%ANO%
goto registro_citas
:ses
set DDD=0%D_A%
goto sis
:ses1
set MMM=0%M_A%
goto sus
Y como bien dices pues al darme cuenta de eso saltaron muchísimas otras cosas que ya modifique y jusito ahora estaba apunto de testear todo!
En cualquier caso aprovecho para comentarte que el comando start no me funciona bien, no se que pasa pero por ejemplo quiero ir de un archivo .bat en el disco C: al disco D: y de repente no entra se queda en negro y como si no terminara de entrar pero lo peor es que tampoco entra a un archivo que esta en el mismo disco y en la misma carpeta! No lo entiendo xD
Un par de cosas:
1. Para copiar el "código" de tu "programa" te sugiero que utilices el icono "<>" de la barra de herramientas (snippet). Le da más legilibilidad a las cosas al separarlo del texto de la consulta
2. Respecto al problema del START copia en un snippet, por ejemplo, el código completo del START y si puedes un pantallazo de la ventana negra que comentas.
por cierto , gracias por la explicación entendí perfectamente el rollo con el dato de que solo es hasta 07 jejej creo que podre aplicar eso en futuros problemas , y la verdad que tienes razón , era tan fácil como buscar información sobre que coño son esos números XD! la mente humana tan brillante para algunas cosas y tan absurdas para otras .... jejejejeje
aaaa coñooooo ! y yo preguntándome como se hacia eso otra prueba mas de lo relativa que es la estupidez y la inteligencia humana XD! , se pueden añadir varios e visto yo pero a mi se me complica para poner dos XD !
cls echo Accediendo ... echo. tree E:\Carpeta1T\ echo. echo. echo Pulsa enter para acceder pause>nul cd E: start puente.bat
Bueno, en cuanto al lo del start, ahora buscado pues la verdad es que lo de que salga la pantalla en negro eso no me pasa porque de tantas vueltas que le di , pues le acabe mandando ordenes de que hiciera esto pero aun así me sale el mensajito de que no encuentra el archivo .bat pero en un principio tenia puesto como este ejemplo que no me funciona para abrir el zoom: " start C:\Users\D\AppData\Roaming\Zoom\bin\Zoom.exe"
y nose la verdad que el start no lo entiendo bien porque aveces funciona perfectamente y otras no! y tengo que acabar haciendo cosas así como descuartizando como digo yo para acabar entrando en los sitios, pero aveces lo de la pantalla negra es como si saliera del mi "programa" valga la redundancia jejejej , y se quedara lo del "símbolo del sistema" esperando que le inserte algún code.
Creo que me estás diciendo que, para el ejemplo concreto que me aportas, te sale un mensaje indicando que no encuentra el PUENTE.BAT. Obviamente este no sería el caso de la ventana negra de la que hablabas sino que habría que preceder al START de un comando tipo CD para que mostrara el directorio/carpeta sobre el que se está trabajando, con lo que podríamos comprobar que ese archivo no se encuentra en ese directorio/carpeta. La opción más segura es poner todo el PATH del archivo BAT.
Ahora me surge la duda de que el mensaje de que no encuentra el archivo se refiere al START para arrancar el Zoom. Si es así habría que revisar la sintaxis del START.
Supongo que ya lo habrás hecho pero, por si acaso, te sugiero que teclees START /? en una ventana CMD para obtener la ayuda de ese comando. A partir de lo que se lee ahí creo que el comando START correcto para lanzar Zoom sería:
START /D"C:\Users\D\AppData\Roaming\Zoom\bin" Zoom.exe
bua! Eres genial! Si conozco la ayuda en la ventada de CMD pero la verdad que hasta hoy no me ha llevado a ninguna solución pues me aun me cuesta entender bien todo técnicamente hablando.
Y debo comentarte que lo conseguido! Y aunque parezca que no tu ayuda a sido fundamental solo por el simple motivo de interactuar con alguien. Por un lado me motiva a estar más y mejor informado para interactuar de mejor manera y por otro lado pues me da la sensación de alivio.
Aquí esta mi pequeña obra de arte jejejeje:
:buscar_fecha_libre cls Echo. echo ====================================== Echo "1. A partir de Hoy" Echo. Echo "2. A partir de una fecha en concreto" echo ====================================== echo. set /p elige= Apartir de...: echo. echo. if %elige%==1 (call :seguimosmai) if %elige%==2 (goto :neXt) else (echo opcion inccorrecta ) goto buscar_fecha_libre :seguimosmai set elegirDia=%DIA% set MeS=%MES% set /p frecuencia=1.semanalmente 2.Cada 15 dias 3.Cada 21 dias 4.Mensualmente if %frecuencia%==1 (set elegirFrecuencia=%FRECUENCIA1% & goto nexT2) if %frecuencia%==2 (set elegirFrecuencia=%FRECUENCIA2% & goto nexT2) if %frecuencia%==3 (set elegirFrecuencia=%FRECUENCIA3% & goto nexT2) if %frecuencia%==4 (set elegirFrecuencia=%FRECUENCIA4% & goto nexT2) else (echo El numero no corresponde con niguna frecuencia) & (goto seguimosmai) :nexT2 set /a resultado_principal=%elegirDia%+%elegirFrecuencia% call :chekeo Pause>nul :Error Echo Si sale esto hay un error! goto error2 :Restar Echo estamos en restar Pause>nul rem - - - - - - - - - - - - - - - - - - - - - - - if %MeS%==1 (set restames=31) if %MeS%==2 (set restames=28) if %MeS%==3 (set restames=31) if %MeS%==4 (set restames=30) if %MeS%==5 (set restames=31) if %MeS%==6 (set restames=30) if %MeS%==7 (set restames=31) if %MeS%==8 (set restames=31) if %MeS%==9 (set restames=30) if %MeS%==10 (set restames=31) if %MeS%==11 (set restames=30) if %MeS%==12 (set restames=31) set a=1 set /a dia=%resultado_principal%-%restames% set /a MESprincipal=%MeS%+%a% pause>nul if %MESprincipal%==2 (call :FEB) if %MESprincipal%==4 (call :ABR) if %MESprincipal%==6 (call :JUN) if %MESprincipal%==9 (call :SEPT) if %MESprincipal%==11 (call :NOV) if %MESprincipal%==12 (call :DIC) else (goto perfecto_en_resta) :perfecto_en_resta Echo estamos en perfecto resta Pause>nul Echo. Echo. Echo. if %dia% LSS 10 (call :QQQ) else (set DDD=%dia%) Pause>nul :WQQ if %MESprincipal% LSS 10 (call:QQW) else (set MMM=%MESprincipal%) Pause>nul :wqw echo ----------------------------------- La cita seria el dia %DDD%/%MMM%/%ANO% -------P-EN-R--------------- Echo. Echo. Echo. Echo. Pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :QQQ set DDD=0%dia% goto WQQ :QQW set MMM=0%MESprincipal% goto :wqw :FEB set g=1 set h=28 echo estamos en FEB if %dia% GTR 28 (call magior1) else (goto resultado_feb_final) :magior1 set /a M_A=%MESprincipal%+%g% set /a D_A=%dia%-%h% pause>nul if %D_A% LSS 10 (call :ses) else ( set DDD=%D_A%) :sis if %M_A% LSS 10 (call :ses1) else (set MMM=%M_A%) :sus echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :ses set DDD=0%D_A% goto sis :ses1 set MMM=0%M_A% goto sus :resultado_feb_final echo estamos en FEB_final if %dia% LSS 10 (call :gag)else (set DDD=%dia%) :gig if %MESprincipal% LSS 10 (call :aga) (set MMM=%MESprincipal%) :gug echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :gag set DDD=0%dia% goto gig :aga set MMM=0%MESprincipal% goto gug :ABR set i=1 set j=30 echo estamos en ABR if %dia% GTR 30 (Call :mavior1) else (goto resultado_ABR_final) :mavior1 set /a M_A=%MESprincipal%+%i% set /a D_A=%dia%-%j% pause>nul if %D_A% LSS 10 (call :pap) else (set DDD=%D_A%) :pap1 if %M_A% LSS 10 (call :pup) else (set MMM=%M_A%) :pup1 echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :pap set DDD=0%D_A% goto pap1 :pup set MMM=0%M_A% goto pup1 :resultado_ABR_final echo estamos en ABR_final if %dia% LSS 10 (call :ooo) else (set DDD=%dia%) :iui if %MESprincipal% LSS 10 (call :uuu) else (set MMM=%MESprincipal%) :uiu echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :ooo set DDD=0%dia% goto iui :uuu set MMM=0%MESprincipal% goto uiu :JUN set e=1 set f=30 echo estamos en JUN pause>nul if %dia% GTR 30 (call :mafor1) else (call :resultado_jun_final) pause>nul :mafor1 set /a M_A=%MESprincipal%+%e% set /a D_A=%dia%-%f% pause>nul if %D_A% LSS 10 (call :vav) else (set DDD=%D_A%) Pause>nul :vav1 if %M_A% LSS 10 (call :he) else (set MMM=%M_A%) pause>nul :he1 echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :vav set DDD=0%D_A% goto vav1 :he set MMM=0%M_A% goto he1 :resultado_jun_final echo estamos en JUN_final pause>nul if %dia% LSS 10 (call :dalet) else (set DDD=%dia%) Pause>nul :dalet1 if %MESprincipal% LSS 10 (call :nun) else (set MMM=%MESprincipal%) pause>nul :nun1 echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :dalet set DDD=0%D_A% goto dalet1 :nun set MMM=0%MESprincipal% goto nun1 :SEPT set c=1 set d=30 echo estamos en SEPT if %dia% GTR 30 (call :matror) else (goto resultado_sept_final) :matror set /a M_A=%MESprincipal%+%c% set /a D_A=%dia%-%d% pause>nul if %D_A% LSS 10 (call :ABC ) else (set DDD=%D_A%) rem---------------------------------- :cba if %M_A% LSS 10 (call :ABC1) else (set MMM=%M_A%) :cba1 echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%day%-%MMM%-%ANO% goto registro_citas :ABC set DDD=0%D_A% goto cba :ABC1 set mez=0%M_A% goto cba1 :resultado_sept_final echo estamos en SEPT_final if %dia% LSS 10 (call :AA1) else (set DDD=%dia%) :BB11 if %MESprincipal% LSS 10 (call :AA2) else (set MMM=%MESprincipal%) :BB1 echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :AA1 set DDD=0%dia% goto BB11 :AA2 set MMM=0%MESprincipal% goto BB1 :NOV set a=1 set b=30 echo estamos en NOV if %dia% GTR %b% call :maror1 else (goto resultado_nov_final) :maror1 set /a M_A=%MESprincipal%+%a% set /a D_A=%dia%-%b% pause>nul if %D_A% LSS 10 (call :rakata) else (set DDD=%D_A%) :rakata1 if %M_A% LSS 10 (call :katarra) else (set MMM=%M_A%) :katarra1 echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :rakata set DDD=0%D_A% goto rakata1 :katarra set MMM=0%M_A% goto katarra1 :resultado_nov_final echo estamos en NOV_final if %dia% LSS 10 (call :kok) else (set DDD=%dia%) kok1 if %MESprincipal% LSS 10 (call :kik) else (set MMM=%MESprincipal%) kik1 echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :kok set DDD=0%dia% goto kok1 :kik set MMM=0%MESprincipal% goto kik1 :DIC set k=31 set l=1 set m=11 echo estamos en DIC if %dia% GTR 31 (call :mayot1) else (goto resultado_dic_final) :mayot1 set /a N_N=%ANO%+%l% set /a D_A=%dia%-%k% set /a M_A=%MESprincipal%-%m% echo Feliz A_o Nuevo!!!! esta cita será para el "20%N_N%" pause>nul if %D_A% LSS 10 (call :j1j ) else (set DDD=%D_A%) :j1j1 if %M_A% LSS 10 (call :j2j) else (set MMM=%M_A%) :j2j2 echo ------------- La cita seria el dia %DDD%/%MMM%/%N_N% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%N_N% goto registro_citas :j1j set DDD=0%D_A% goto j1j1 :j2j set MMM=0%M_A% goto j2j2 :resultado_dic_final echo estamos en diciembre final if %dia% LSS 10 (call :y1y) else (set DDD=%dia%) :y1y1 if %MESprincipal% LSS 10 (call :y2y) else (set MMM=%MESprincipal%) :y2y2 echo -------------------------- La cita seria el dia %DDD%/%MMM%/%ANO% --------------------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :y1y set DDD=0%dia% goto y1y1 :y2y set MMM=0%MESprincipal% goto y2y2 rem ================================================================================================================ :ok set A=1 set B=2 set C=30 set D=31 set E=28 set F=11 echo estamos en ok pause>nul if %MeS%==2 (call :FEB2) if %MeS%==4 (call :ABR2) if %MeS%==6 (call :JUN2) if %MeS%==9 (call :SEPT2) if %MeS%==11 (call :NOV2) if %MeS%==12 ( call :DIC2) else (goto perfecto_sin_resta) :perfecto_sin_resta Echo estamos en perfecto sin resta Pause>nul Echo. Echo. Echo. Echo. if %diaOK% LSS 10 (call :Q1Q) else (set DDD=%diaok%) :Q1Q1 if %MeS% LSS 10 (call :Q2Q) else (set MMM=%MeS%) :Q2Q2 echo -------------------------- La cita seria el dia %DDD%/%MMM%/%ANO% --------------------------- echo. pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :Q1Q set DDD=0%diaok% goto Q1Q1 :Q2Q set MMM=0%MeS% goto :Q2Q2 :FEB2 echo estamos en feb2 if %resultado_principal% GTR %E% (call :mayoor1) else (goto resultado_feb_final2) :mayoor1 set /a M_A=%MeS%+%A% set /a D_A=%resultado_principal%-%E% if %D_A% LSS 10 (call :k1k) else (set DDD=%D_A%) :k1k1 if %M_A% LSS 10 (call:k2k) else (set MMM=%M_A%) :k2k2 echo ------------------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :k1k set DDD=0%D_A% goto k1k1 k2k set MMM=0%M_A% goto k2k2 :resultado_feb_final2 echo estamos en feb_final2 if %resultado_principal% LSS 10 (call :z1z) else (set DDD=%resultado_principal%) :z1z1 if %MeS% LSS 10 (call :z2z) else (set MMM=%Mes%) :z2z2 echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :z1z set DDD=0%resultado_principal% goto z1z1 :z2z set MMM=0%MeS% goto z2z2 :ABR2 echo estamos en ABR2 if %resultado_principal% GTR %C% (call :mayorr1) else (goto resultado_ABR_final2) :mayorr1 set /a M_A=%MeS%+%A% set /a D_A=%resultado_principal%-%C% pause>nul if %D_A% LSS 10 (call :m1m) else (set DDD=%D_A%) :m1m1 if %M_A% LSS 10 (call :m2m) else (set MMM=%M_A%) echo ------------------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :m1m set DDD=0%D_A% goto m1m1 :m2m set MMM=0%M_A% goto m2m2 :resultado_ABR_final2 echo estamos en abr_final2 if %resultado_principal% LSS 10 (call :h1h) else (set DDD=%resultado_principal%) :h1h1 if %MeS% LSS 10 (call :h2h) else (set MMM=%MeS%) :h2h2 echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :h1h set DDD=0%resultado_principal% goto h1h1 :h2h set MMM=0%MeS% goto h2h2 :JUN2 echo estamos en jun2 if %resultado_principal% GTR %C% (call :mayor1) else (call :resultado_jun_final2) :mayor1 set /a M_A=%MeS%+%A% set /a D_A=%resultado_principal%-%C% pause>nul if %D_A% LSS 10 (call :x1x) else (set DDD=%D_A%) Pause>nul :x1x1 if %M_A% LSS 10 (call :x2x) else (set MMM=%M_A%) pause>nul :x2x2 echo ------------------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :x1x set DDD=0%D_A% goto x1x1 :x2x set MMM=0%M_A% goto x2x2 :resultado_jun_final2 Echo estamos en jun final2 Pause>nul if %resultado_principal% LSS 10 (call :c1c) else (set DDD=%resultado_principal%) Pause>nul :c1c1 if %MeS% LSS 10 (call :c2c) else (set MMM=%MeS% ) Pause>nul :c2c2 echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :c1c set DDD=0%resultado_principal% pause>nul goto c1c1 :c2c set MMM=0%MeS% pause>nul goto c2c2 :SEPT2 echo estamos es sept2 if %resultado_principal% GTR %C% (call :makior1) else (goto resultado_sept_final2) :makior1 set /a M_A=%MeS%+%A% set /a D_A=%resultado_principal%-%C% pause>nul if %D_A% LSS 10 (call :r2r) else (set DDD=%D_A%) :r1r1 if %M_A% LSS 10 (call :r2r) else (set MMM=%M_A%) :r2r2 echo ------------------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :r1r set DDD=0%D_A% goto r1r1 :r2r set MMM=0%M_A% goto r2r2 :resultado_sept_final2 Echo estamos en sept final2 Pause>nul if %resultado_principal% LSS 10 (call :d1d) else (set DDD=%resultado_principal%) Pause>nul :d1d1 if %MeS% LSS 10 (call :d2d) else (set MMM=%MeS%) Pause>nul :d2d2 echo ------------------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :d1d set DDD=0%resultado_principal% goto d1d1 :d2d set MMM=0%MeS% goto d2d2 :NOV2 echo estamos en nov2 if %resultado_principal% GTR %C%(set /a M_A=%MeS%+%A% set /a D_A=%resultado_principal%-%C%) else (goto resultado_nov_final2) pause>nul echo. if %D_A% LSS 10 (call :t1t) else (set DDD=%D_A%) :t1t1 if %M_A% LSS 10 (call :t2t) else (set MMM=%M_A%) :t2t2 echo ------------------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :t1t set DDD=0%D_A% goto t1t1 :t2t set MMM=0%M_A% goto :t2t2 :resultado_nov_final2 echo estamos en nov final2 if %resultado_principal% LSS 10 (call :u1u) else (set DDD=%resultado_principal%) :u1u1 if %MeS% LSS 10 (call :u2u) else (set MMM=%MeS%) :u2u2 echo ------------- La cita seria el dia %DDD%/%MMM%/%ANO% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :u1u set DDD=0%resultado_principal% goto u1u1 :u2u set MMM=0%MeS% goto :u2u2 :DIC2 echo estamos en DIC2 if %resultado_principal% GTR %D% (set /a N_N=%ANO%+%A% set /a D_A=%resultado_principal%-%D% set /a M_A=%MeS%-%F%) else (goto resultado_dic_final) pause>nul if %D_A% LSS 10 (call :j3j ) else (set DDD=%D_A%) :j3j3 if %M_A% LSS 10 (call :j4j) else (set MMM=%M_A%) :j4j4 echo ------------- La cita seria el dia %DDD%/%MMM%/%N_N% ---------------- pause>nul set fechasMUL=%DDD%-%MMM%-%N_N% goto registro_citas :j3j set DDD=0%D_A% goto j13j3 :j4j set MMM=0%M_A% goto j4j4 :resultado_dic_final echo estamos en diciembre final if %resultado_principal% LSS 10 (call :y3y) else (set DDD=%resultado_principal%) :y3y3 if %MES% LSS 10 (call :y4y) else (set MMM=%MeS%) :y4y4 echo -------------------------- La cita seria el dia %DDD%/%MMM%/%ANO% --------------------------- pause>nul set fechasMUL=%DDD%-%MMM%-%ANO% goto registro_citas :y3y set DDD=0%resultado_principal% goto y3y3 :y4y set MMM=0%MeS% goto y4y4 :neXt Echo "Aqui recuerda que si el numero del Dia o del Mes es igual o inferior a 9 debes de ponerlo SIN EL CERO DELANTE" echo. set /p F_d=Introduce el dia en numero : set /p F_m=Introduce el mes en numero : set MeS=%F_m% set elegirDia=%F_d% set /p frecuencia=1.semanalmente 2.Cada 15 dias 3.Cada 21 dias 4.Mensualmente if %frecuencia%==1 (set elegirFrecuencia=%FRECUENCIA1% & goto nEn) if %frecuencia%==2 (set elegirFrecuencia=%FRECUENCIA2% & goto nEn) if %frecuencia%==3 (set elegirFrecuencia=%FRECUENCIA3% & goto nEn) if %frecuencia%==4 (set elegirFrecuencia=%FRECUENCIA4% & goto nEn) else (echo El numero no corresponde con niguna frecuencia) & (goto neXt2 ) :nEn set /a resultado_principal=%elegirDia%+%elegirFrecuencia% :chekeo echo estamos dentro del chek &pause>nul if %resultado_principal%==1 (goto ok) if %resultado_principal%==2 (goto ok) if %resultado_principal%==3 (goto ok) if %resultado_principal%==4 (goto ok) if %resultado_principal%==5 (goto ok) if %resultado_principal%==6 (goto ok) if %resultado_principal%==7 (goto ok) if %resultado_principal%==8 (goto ok) if %resultado_principal%==9 (goto ok) if %resultado_principal%==10 (goto ok) if %resultado_principal%==11 (goto ok) if %resultado_principal%==12 (goto ok) if %resultado_principal%==13 (goto ok) if %resultado_principal%==14 (goto ok) if %resultado_principal%==15 (goto ok) if %resultado_principal%==16 (goto ok) if %resultado_principal%==17 (goto ok) if %resultado_principal%==18 (goto ok) if %resultado_principal%==19 (goto ok) if %resultado_principal%==20 (goto ok) if %resultado_principal%==21 (goto ok) if %resultado_principal%==22 (goto ok) if %resultado_principal%==23 (goto ok) if %resultado_principal%==24 (goto ok) if %resultado_principal%==25 (goto ok) if %resultado_principal%==26 (goto ok) if %resultado_principal%==27 (goto ok) if %resultado_principal%==28 (goto ok) if %resultado_principal%==29 (goto ok) if %resultado_principal%==30 (goto ok) if %resultado_principal%==31 (goto ok) else (goto restar)
te lo dejo por aquí no se eres ahora mismo la única persona en mi vida con la que comparto esta afición porque mi pareja le encanta las cosas que le hago pero cada vez que le cuenta algo dice venga vamos a practicar un poco de japones jejeje !!! seguro que tu hubieras dado con esto en menos de un día jejeje pero para mi llevo semanas en plan cavernicola dando vueltas y vueltas a mi cabeza para llegar hasta conseguir esto!!!!
Ahora por ejemplo el único problema que tengo que llevo toda la mañana buscado información. Incluso probé una idea tuya en respuestas que has dado tu a otra gente acerca de algo parecido. Pero no doy con la clave, el caso es una vez que la citas se queda registradas existe otro menú de visualizar citas que es otro archivo .bat que están entrelazados en si.
set /p respuesta3= 1.Buscar por NOMBRE_APELLIDO 2. Buscar por fechas 3. Ver el listado de fechas 4. Ir al menu principal if %respuesta3%==1 (goto Buscar_nombres) if %respuesta3%==2 (goto Buscar_fechas) if %respuesta3%==3 (goto ver_fechas) else (echo Numero no corresponde con ninguna opcion.) if %respuesta3%==4 (start /max "C:\Users\maria\Desktop\Oficina\Gestor_de_citas\Gestor_citas_2.bat") &exit goto menu
bueno ese seria el menú del visualizador el problema lo tengo en el 1, buscar por NOMBRE_APELLIDO, pues digamos que tengo la carpeta "gestor_citas" dentro de esa tengo otra carpeta que se llama "citas" y dos archivos bat , uno para crear citas y otro para buscarlas y dentro de la carpeta citas se van creando mas carpetas con el nombre DIA_(fecha) y dentro de cada una de esas carpetas se crean archivos que se llaman: (hora)H_NOMBRE_APELLIDO.text ; intuyo que el comando FOR y el rollo de usar *_NOMBRE_APELLIDO es el que tengo que usar pero no se como.
O también vi otro comando que es el FINDSRT pero tampoco me ha quedado nada claro.
Justo entre otras cosas Llevo todo el día releyendo lo que me dice el CMD cuando le pregunto por FOR /? a ver si saco algo en claro pero ... XD
Entonces necesito digamos que mediante un set /p le inserte el NOMBRE_APELLIDO y busque ese archivo dentro de todas las subcarpetas de la carpeta citas.
Pues si pudiera echarme una manilla más con esto ... Si no pues igualmente te estoy agradecidísimo!
Rectifico! Sigo comprobando días y no lo conseguí del todo! No hay más verdad que "TODO SISTEMA TIENDE A FALLAR" es decir que el orden esta frito por irse al carajo! jejejejejej
Encantado de intentar echarte una mano, aunque para que sea efectiva tengo que entender bien la cuestión. Realmente te has montado un BAT tremendo. Yo sería incapaz de analizarlo pero, afortunadamente, otra cosa es poder ayudar en algún aspecto concreto.
Si te he entendido bien las citas del 8 de mayo de 2021 estarían, todas, dentro de la carpeta GESTOR_CITAS\CITAS\DIA_(08-05-2021). Por ejemplo si el cliente DA_RO tiene cita ese día a las 9:45, existirá en esa carpeta el archivo (09_45)H_DA_RO.TEXT lo que no impide que el mismo cliente tenga citas en otras fechas y/o a otras horas. Si lo que quieres es que cuando se seleccione la opción 1 y una vez tecleado el nombre del cliente se obtenga un listado con los campos FECHA HORA NOMBRE_APELLIDO esto podría servir:
@echo off Setlocal EnableDelayedExpansion set cliente=DA_RO set carpeta=D:\carpeta prueba pushd %carpeta% echo FECHA HORA NOMBRE_APELLIDO echo ---------- ----- ------------------------------------------- for /f "tokens=4,5* delims=\" %%a in ('dir /b/s *%cliente%.TEXT') do ( set hora=%%b&set hora=!hora:~1,5! set fecha=%%a&set fecha=!fecha:~5,10! Echo ! Fecha! ! Hora! %Cliente% ) Popd
Por supuesto esto sería la base de la rutina Buscar_nombres en la que se solicitaría previamente el nombre_apellido del cliente. Si el path de la carpeta base de las citas tiene más componentes que, digamos, E:\GESTOR_CITAS habría que retocar los valores del TOKENS para ajustarlo a ese path. Imagino que te surgirán dudas, sobre todo si, como parece, no estás muy acostumbrado al FOR. Tú pregunta que intentaré responderte, cuando tenga un rato, eso sí.
Mientras preparaba esta respuesta he visto que has escrito algo más, lo que descolocará un poco la secuencia
bua genial! lo voy a probar inmediatamente jejje !
set carpeta=D:\carpeta prueba
Lo único que no me queda claro a priori es en ese SET ,que ruta poner , porque lo de que pusieras "D:" es simplemente parte del ejemplo , o hay que poner D: independientemente de que este la carpeta en el C: , se que es un poco absurdo pero me lio jejejje.Pero bueno en cualquier caso probare hasta dar con la clave e intentare que este funcionando antes de que me vuelvas a contestar jejej.
Pero espero que al poner ahí la ruta donde esta la carpeta C:\Users\m\Desktop\Oficina\Gestor_de_citas\citas
el FOR ese, sea capaz de buscar dentro de las subcarpetas de \citas y eso haga que el resultado sea que se vea:
echo FECHA HORA NOMBRE_APELLIDO
Lo cual seria Magnifico!
Mil gracias de nuevo ! Esto es todo una aventura XD tengo ganas de conseguir todo esto
porque me eh propuesto a mi mismo cuando termine el gestor de citas y este funcione correctamente me pondré a intentar entender otros lenguajes mas complejos y que sean mas versátiles jeje y bueno no quiero dejar de aprender .batch pero sin dudas tengo muchas ganas de ampliar las fronteras.
Usted , si entendieras del caso, en algún momento que tengas tiempo , ¿serias capaz de asesorarme o darme alguna idea de que lenguajes que investigar, o indagar? porque claro es que buscando información por ahí veo tanta que es que aveces se me hace difícil aclararme y decidir que mas lenguajes aprender, por ahora tengo claro que quiero aprender html, css y javasscript , tengo entendido que es actualmente lo básico para desarrollar web , pero me gustaría, no quedarme ahí , el problema que tengo yo personalmente es que da la sensación de que estudiar ciertos lenguajes te encasilla en algo predeterminado, pero después encuentro de vez en cuando otras corrientes que me motivan más, que de alguna manera estudian las bases para entender casi cualquier lenguaje de programación, claro que esto ultimo no me es tan fácil encontrar y no se si hay algún nombre o algo en especial que se refiera a este tipo de estudio de los lenguajes de programación.
Y es que no se, realmente no tengo prisa en aprender puesto que vas viendo los resultados de lo que vas aprendiendo al mismo tiempo que aprendes y eso me fascina ya que es el aprendizaje natural de la vida el que se comporta así, que paradójicamente en el contexto no digital ya difícilmente vemos ese mismo comportamiento en las rutinas de aprendizaje cotidianas de un estudiante medio en las escuela o la universidad, este , supuestamente tiene que esperar años , tan solo para ¡comenzar! a ver los resultado reales de lo aprendido.
Pero al igual que no tengo prisa en aprender , me gustaría no malgastar mi futuro tiempo investigando en lenguajes pues que al final me acaben encasillando o limitando de alguna manera.
Un saludo!
Setlocal EnableDelayedExpansion set /p cliente=Escribe el NOMBRE_APELLIDO : set carpeta=C:\Users\ma...\Desktop\Oficina\Gestor_de_citas\citas pushd %carpeta% echo FECHA HORA NOMBRE_APELLIDO echo ---------- ----- ------------------------------------------- for /f "tokens=4,5* delims=\" %%a in ('dir /b/s *%cliente%.TEXT') do ( set hora=%%b&set hora=!hora:~1,5! set fecha=%%a&set fecha=!fecha:~5,10! Echo ! Fecha! ! Hora! %Cliente% ) Popd pause>nul
Definitivamente me ocurre lo que intuía y lo que creo entender que ya me vienes avisando de lo de los valores del TOKENS.
Eso es lo que ocurre , me pegare un rato jugando con el TOKENS a ver que pasa jejjeje!
Te actualizo un poco la propuesta para incorporar el path de la carpeta de citas y retocar los TOKENS del FOR:
@echo off Setlocal EnableDelayedExpansion set cliente=DA_RO set carpeta=C:\Users\m\Desktop\Oficina\Gestor_de_citas\citas pushd %carpeta% echo FECHA HORA NOMBRE_APELLIDO echo ---------- ----- ------------------------------------------- for /f "tokens=8,9* delims=\" %%a in ('dir /b/s *%cliente%.TEXT') do ( set hora=%%b&set hora=!hora:~1,5! set fecha=%%a&set fecha=!fecha:~5,10! Echo ! Fecha! ! Hora! %Cliente% ) Popd
Creo que con esto, si rellenas la variable CLIENTE con el NOMBRE_APELLIDO de alguno de los que figuran en las citas podrás ver lo que te sale. Ya me contarás.
En cuanto a recomendaciones respecto a lenguajes de programación, en los últimos tiempos ha habido un "cambio de paradigma" (sea lo que sea lo que signifique eso) que no tienen que ver tanto con las bases estructurales de la programación, que siguen siendo secuencial (cuando las instrucciones van una detrás de otra), repetitiva (los bucles FOR y DO en todas sus variantes) y alternativa (los IF), como con el diseño de los tratamientos. Estoy hablando de la programación orientada a objetos (POO) que es un tema que no conozco muy bien (y he hecho algún intento pero no acabo de dominarlo) pero que sé que es por donde se mueve el "mercado" actual. Por tanto te recomendaría que te orientaras en ese sentido. Por ejemplo, de la misma forma que existe el lenguaje BATCH para la, digamos, shell MSDOS, existe otro lenguaje para la otra shell existente en Windows, Powershell, que ya incorpora, creo, la POO. Es un lenguaje muy potente y sin los problemas de los BAT. De hecho cuando no consigo resolver alguna cosa con un BAT siempre acabo encontrando una solución en Powershell.
Bueno, esto es un poco rollo, y más cuando se plantea en plan abstracto. Podría ponerte algún ejemplo concreto, si acabas teniendo alguna curiosidad.
Tengo entendido que para programación en entornos web está bastante de moda el lenguaje Python.
y por cierto no se si tendrá algo que ver para el tokens pero el archivo se quedan llamando así: 19-00.H_MARIA_PEREZ.text
Se me olvidó advertirte de que el editor de la página tiene la fea costumbre de separar los símbolos de admiración de las variables a las que acompaña. Aunque ponga "! Fecha!" y "! Hora!" en realidad no debe haber espacios entre la primera admiración y Fecha y Hora.
BIEN casi lo conseguimos!!!!!! ;D , aquí el problema es que la fecha de esa clienta es a las 18H no a las 8 y ademas , hay otra cosita que se me paso por alto comentar jejej, y es que cada documento que se crea, ese por ejemplo seria "18-00.H_CRISTINA_GIL.text"
Pues dentro de ese documento, automáticamente lo que hay es lo siguiente :
====================================================
Para el Dia :19-04-21
Tienes una cita a las 18:00 horas con CRISTINA_GIL
- - - - - - - - - - -Notas - - - - - - - - - - - -
- -
Y en el caso de que hubiera una nota escrita a la hora de registrar la cita, aparecería donde ahora hay simplemente "- -" indicando justamente que esa cita no tiene ninguna nota añadida , mi idea era algo así como que el FOR buscara el archivo 19-00.H_CRISTINA_GIL.text dentro de las subcarpetas de la carpeta \citas que esas se nombran tal que "Dia_22_05_21" (por ejemplo) encontrara tal archivo porque se que el FOR puede encontrar archivos con el comodín * , dentro de todas las subcarpetas , si no me equivoco, y que a continuación activara a lo mejor un TYPE con la información del documento o algo por el estilo.
Por eso el problema que yo me encuentro es el de hacer un FOR para que encuentre el archivo dentro de las subcarpetas de la carpeta \citas y lo muestre tal cual es el en el interior. No se si me he llegado a explicar mejor y si se podría llegar a lograr algo así
HEY eres un crack , me respondiste antes de que me diera tiempo a terminar de escribir jajajja !
cambiando la variable de la hora, La hora sale perfectaemente ! !!
Para la fecha sería:
set fecha=%%a&set fecha=!fecha:~4,8!
Si la nota que quieres sacar figura siempre en la quinta línea del archivo creo que también se podría incluir mediante una rutinilla de lectura del propio archivo.
Intuyo que dices la quinta línea porque es la línea donde dice -- ----NOTAS- - - - - -
Pero en ese caso las notas aparecerían siempre en la línea 6 y no creo que ocupen más de 2 o 4 líneas para abajo es decir como máximo desde la línea 6 hasta la 10, pero en general ocupan solo la línea 6.
Por cierto , no puedo valorarte más que una vez? no hay opción de re valorar las contestaciones o algo así ?
Si he entendido bien el texto de la cita tiene el formato:
==================================================== Para el Dia :19-04-21 Tienes una cita a las 18:00 horas con CRISTINA_GIL - - - - - - - - - - -Notas - - - - - - - - - - - - - -
Si es así el texto de la nota empieza en la línea 5. Si puede haber más de una línea no sé como encajarlo con el resto del "registro" Fecha/Hora/Cliente. Para una sola línea podría valer algo así:
Setlocal EnableDelayedExpansion set /p cliente=Escribe el NOMBRE_APELLIDO : set carpeta=C:\Users\ma...\Desktop\Oficina\Gestor_de_citas\citas pushd %carpeta% echo FECHA HORA NOMBRE_APELLIDO NOTAS echo -------- ----- ------------------------------------------- ----------------------------------- for /f "tokens=4,5* delims=\" %%a in ('dir /b/s *%cliente%.TEXT') do ( for /f "usebackq skip=4 tokens=*" %%x in ("%carpeta%\citas\%%a\%%b") do set nota=%%x set hora=%%b&set hora=!hora:~0,5! set fecha=%%a&set fecha=!fecha:~4,8! Echo ! Fecha! ! Hora! %Cliente% ! Nota! ) Popd Pause>nul
aunque habría que encontrar la forma de alinear la nota con la cabecera.
Respecto a la valoración, no te preocupes. Reconozco que me pareció un poco pobre, teniendo en cuenta que aunque no había hecho nada más que explicarte lo que preguntabas inicialmente, era lo que pedías. Pero nunca dejo que eso me influya gran cosa.
Lo que ya no llevo tan bien es que a veces la persona que pregunta o no lee la respuesta o le parece que no vale la pena probar lo que se sugiere o comentar nada al respecto. No pasa mucho, pero pasa y no puedo entenderlo.
¿Pero digo no hay manera de hacerlo? O no se la verdad es que no se que es como funciona, ni si se podía valorar más o que ! Mi intención era darte todo lo que pudiera! xD, de echo me metí aquí a preguntar porque varias cosas de las que he ido aprendiendo, ha sido gracias contestaciones, precisamente tuyas a otros usuarios en esta página que el buscador me encontró por lo que yo estaba buscando, y antes de contactar contigo ya me habías solucionado algún problema que otro! xD por eso mi intención era valorarte lo máximo posible dado que no sabia al cien por cien si contestarías y mira! Pero debido a mi ignorancia con la plataforma y relativamente en general no se que hice ! xD
Me gustaría dejar constancia ahora que leí su mensaje que si a mi me pasa eso como preguntador con usted, tenga claro que es que se me pasa por alto porque no la veo en el hilo o lo que sea, porque por ahora creo que lo único que he dejado de "lado" de lo que me has comentado (corrígeme si me equivoco por favor, porque para nada es mi intención crearle esas incomodidades vamos a llamar), es la parte del START, pero eso es debido a que hoy llevo todo el día dándole caña a esto que estamos desarrollando y pues la verdad que estoy centrado en esto, antes estuve probando lo del START y aun me sigue saltando la pantalla, pero como eso me frustra y con esto otro estoy avanzando bastante pues me he concentrado en esto básicamente para no liarme yo ni a ti tampoco. Porque al final en verdad ; lo del START es para poder entrar y salir de un archivo bat a otro sin tener que hacerlo manualmente, pero vamos que eso no es fundamental y es lo que más problemas me esta dando no entiendo muy bien porque entonces lo eh dejado aparcado.
Insisto, no te preocupes por eso. Hago esto porque me gusta y ahí es donde está mi mayor recompensa.
De ninguna manera me refería a ti en mi comentario respecto a los que no leen las respuestas. Es gente que parece abandonar el asunto, a veces ni siquiera comentan la primera respuesta. Te pongo un ejemplo reciente:
Oye , aprovechando que estas aquí , la rutina esa algo esta fallando estoy dándole vueltas pero ya que estas aquí te pregunto
Lo he puesto tal que así:
Setlocal EnableDelayedExpansion set /p cliente=Escribe el NOMBRE_APELLIDO : set carpeta=C:\Users\m...\Desktop\Oficina\Gestor_de_citas\citas pushd %carpeta% echo FECHA HORA NOMBRE_APELLIDO NOTAS echo -------- ----- ----------------------------------------------------- for /f "tokens=4,5* delims=\" %%a in ('dir /b/s *%cliente%.TEXT') do ( for /f "usebackq skip=4 tokens=*" %%x in ("%carpeta%\citas\%%a\%%b") do set nota=%%x set hora=%%b&set hora=!hora:~0,5! set fecha=%%a&set fecha=!fecha:~4,8! Echo !Fecha! !Hora! %Cliente% !Nota! ) Popd
y resulta que sale esto
y bueno me puse a fijarme y en [ for /f "usebackq skip=4 tokens=*" %%x in ("%carpeta%\citas\%%a\%%b") ] no se si tendrá algo que ver el que pongas la variable %carpeta% y que después le pongas de nuevo \citas , en cualquier caso lo probé de las dos maneras y me seguía dando error.
Y creo que estoy empezando a entender como funciona esto del FOR o digamos la lógica de lo que esta haciendo o eso quiero imaginar jejeje. y lo siguiente que voy a mirar es a ver si se me colo algún espacio por algún lado pero bueno, por si acaso no sea eso , te lo comento a ver que opinas.
Vale, intuyo cual es el problema, y es que sale como sale "top" y ofici", supongo que sera algo de que esos numeritos en algún sitio no están bien, por el tema a lo mejor de que en el path
set carpeta=C:\Users\maria\Desktop\Oficina\Gestor_de_citas\citas
Y "top" coincide con DesKtop y Ofici, con oficina.
Es lo único que se me ocurre jejej. Voy ponerme el reto de a ver si doy con la solución antes de que me contestes contrastando tu propuesta con la ayuda del FOR /? en el CMD, va a estar divertido ! xD
Es que además supongo que es algo relacionado con esto :[ %%a\%%b] si mi lógica no me falla, je je!
cls Setlocal EnableDelayedExpansion set /p cliente=Escribe el NOMBRE_APELLIDO : set carpeta=C:\Users\maria\Desktop\Oficina\Gestor_de_citas\citas pushd %carpeta% echo FECHA HORA NOMBRE_APELLIDO NOTAS echo -------- ----- ----------------------------------------------------- for /f "tokens=8,9* delims=\" %%a in ('dir /b/s *%cliente%.TEXT') do ( for /f "usebackq skip=4 tokens=*" %%x in ("%carpeta%\%%a\%%b") do set nota=%%x set hora=%%b&set hora=!hora:~0,5! set fecha=%%a&set fecha=!fecha:~4,8! Echo ! Fecha! ! Hora! %Cliente% ! Nota! ) Popd Pause>nul
siiiii! Lo CONSEGUIMOS! En efecto compañero! jajaja juraría que lo has puesto en plan acertijo! Si es así ha sido fenomenal para entender un poquito más la lógica del FOR ! Gracias por la rutinillaa va de lujo! tuve que cambiar el TOKENS y ponerlo de nuevo a 8,9, jejej porque claro me di cuenta que delims =\ (no había caído en ese detalle de que \ eso eso lo mismo que \carpeta !, pero aun así aun no entiendo muy bien la lógica de que sea 8 y 9, porque por más que cuento no me salen las cuentas ! xD
A raíz de esto, me ha despertado curiosidades, que seguro que en algún futuro serán productivas
Como lo de investigar sobre el Setlocal y el Popd
No he podido atender tus últimos mensajes porque los fines de semana estoy un poco apurado. Me di cuenta de que había metido la pata en los valores de los TOKENS, y también que tienes razón en que hay que quitar el "citas" del FOR interno. Ambas cosas son consecuencia de los BAT de prueba que uso en mi entorno para intentar reproducir el tuyo.
Cuando en el DELIMS pones un valor, como el "\" de nuestro caso, se empiezan a generar "campos" de la línea. En este caso las líneas a tratar tienen un aspecto como:
C:\Users\m\Desktop\Oficina\Gestor_de_citas\citas\DIA_03-06-21\09-45H_DA_RO.text
El parámetro TOKENS indica cuales de esos campos se van a asignar a las variables del FOR (en este caso %%a y siguientes). Si cuentas los campos verás que el primero sería "C:", el segundo "Users", el octavo "DIA_03-06-21" y el noveno "09-45H_DA_RO.text". Como solo nos interesan estos dos últimos ponemos "TOKENS=8,9*" (el * significa que hay que tomar el resto de los campos si los hubiera y no sería necesario). De modo que a la variable %%a se le asigna el octavo campo y a la %%b el noveno.
El SetLocal debe ponerse cuando los bucles FOR pueden modificar los valores de algunas variables, en cuyo caso se deben invocar de la forma ! Variable! En lugar de %variable%, aunque sobre esto hay bastante "tela que cortar".
El PUSHD/POPD sirve para situarse en el directorio/carpeta que se indica en el PUSHD pero salvando el actual. El POPD restaura ese valor salvado. He empezado a usarlo recientemente y me parece muy cómodo.
Por eso no me salían las cuentas, ya que yo contaba las letras individuales xD,
Me a resultado muy divertido indagar en tu rutina! Así que no te preocupes, yo los fin de semanas estoy menos con el vicio este je je y gracias a tus pequeños errores en el sript eso se convirtió en una clase magistral de iniciación al FOR, se que aun me queda mucha tela que cortar como dices tu je je pero creo que voy entendiendo mucho mejor el FOR!
Me he propuesto un último reto! Al menos por ahora y empezar a jugar con otros lenguajes ( ultimo si se me dejan de ocurrir actualizaciones) xD
Voy a intentar que desde ese .bat genere automáticamente, otro .bat con el nombre de la fecha y ese .bat, la idea es que sea un cuestionario que rellenar, que al final de cada día de trabajo, pues pregunte has tenido una cita con "nosequien"¿se ha realizado, ha sido cancelada o pospuesta? Y una serie de preguntas de control, y este .bat generaría un documento de texto con el cuestionario relleno y algunos datos más, en general, de ese día en concreto.
Es decir quiero quiero que un .bat, cree diariamente otro archivo .bat para que este genere documentos de texto . no se si me he explicado !
Bueno el caso es que solo es, por si tienes alguna sugerencia o si alguna idea, je je si no ya te iré comentando esta nueva aventura:
:cuestionarioss cd "C:\Users\maria\Desktop\Oficina\Gestor_de_citas\Cuestionario_dsps_citas\cuestionarios" if exist %fechasMUL%.text (call :AGREGAR) else (call :CREAR) :CREAR echo -------------------------%fechasMUL%-------------------------------- >Cuestionario_del_dia_%fechasMUL%.text echo ==================================================================== >>Cuestionario_del_dia_%fechasMUL%.text cd.. echo @echo off>%fechasMUL%.bat Echo title ARchivo bat por dias>>%fechasMUL%.bat echo color ED>>%fechasMUL%.bat echo echo.>>%fechasMUL%.bat echo echo Hola, hoy %fechasMul% has tenido estas citas:>>%fechasMUL%.bat :AGREGAR Echo Por favor escriba ortograficamente correto el Nombre sin baras bajas para generar el cuestionario post cita. set /p Nombre=Escriba el Nombre : echo -------------------------%H_4%:%M_3%-------------------------------- >>Cuestionario_del_dia_%fechasMUL%.text echo Has tenido una cita con %Nombre% Echo echo A las %H_4%:%M_3% has tenido una cita con %Nombre%>>%fechasMUL%.bat
Por ahora esta es la primera idea que estoy barajando, (al code de arriba aun le falta muchas cosas por matizar pero es como la idea que tengo más o menos) un lado primero genero un archivo de texto en la carpeta \cuestionarios con el nombre "Cuestionario_del_dia(fecha).text"
Voy una carpeta para atrás y le hago generar un archivo .bat que se llama (fecha).bat y mi idea es, pues al igual que puedo ir añadiendo líneas a un documento de texto, a medida que se registre alguien en una misma fecha, pues añadir líneas automáticamente al .bat que estas vayan haciendo el cuestionario.
Entonces la idea es que al final de cada día de trabajo, entrar en la carpeta \cuestionarios_dsps_citas y con tan solo abrir el .bat que indique la misma fecha del día actual, al abrirlo, irían saliendo todos los clientes de ese mismo día y haciendo las preguntas de control acerca de esa cita y este bat generaría automáticamente más líneas en el documento de texto que se genero al principio: "Cuestionario_del_dia_%fechasMUL%.text".
@echo off title ARchivo bat por dias Color ED Echo. Echo Hola, hoy %fechasMul% has tenido estas citas: Pause>nul echo a las %H_4%:%M_3% has tenido una cita con %Nombre% Echo. :cuestion1 set cuestion1=jfoadif set /p cuestion1=Esta cita ha sido cancelada?: 1.Si 2.No if %cuestion1%==jfoadif (goto cuestion1) if %cuestion1%==1 (goto si1) else (goto no1) if %cuestion1%==2 (goto si2) else (goto no2) :si1 Echo ok cita cancelada cd C:\Users\maria\Desktop\Oficina\Gestor_de_citas\Cuestionario_dsps_citas\cuestionarios echo cita cancelada>>Cuestionario_del_dia_%fechasMUL%.text goto siguiente_nombre1 :no1 :si2 :no2
Esa seria como el comienzo de la plantilla de las líneas que tendría que añadir al (fechas).bat
Y el primero problema al que me estoy enfrentado y dándole vueltas es que veo que, cada vez que añadiera líneas nuevas en el bat para crear el cuestionario a medida que se registran las citas, los " :cuestion1 " y todos los demás bucles o gotos esos (:loquesea ), siempre se llamarían igual y supongo, es evidente, que eso volvería loco al archivo bat al iniciarlo para rellenar el cuestionario, porque no sabría a que goto tiene que ir, porque todos se llamarían igual!
Ah y se me olvido comentar que donde pongo cd creo que voy a usar el rollo del pushd y el Popd, porque veo que la forma en la que lo usas tu es mucho más eficiente que estar dándole para adelante y para atrás manualmente a las carpetas.
No acabo de entender que el BAT de control tenga que ser modificado, aunque probablemente sea que no he captado del todo la idea. Con tu estructura de citas parece que no debería ser complicado crear un BAT que, a partir de la comprobación de la fecha actual, revise esa estructura para identificar las citas correspondientes a esa fecha y haga los controles pertinentes, siempre los mismos, claro.
Respecto a PUSHD/POPD lo que comentas fue, precisamente, lo que me pareció un gran hallazgo y, casi instintivamente, lo he incorporado a mis BAT. Además eso fomenta, creo, la buena costumbre de guardar en variables internas todas las cosas, incluso las que creemos que van a ser para siempre, porque si la final no lo son los cambios a realizar están bien identificados y no hay que recorrer todo el código para encontrarlos.
Je je si es un poco complejo de entender, pero creo al respecto, sin entender bien mi idea, tu idea es bastante más congruente que la mía, supongo que con el for se podrá hacer un bat que al introducir la fecha del día actual, el ya buscara los nombres y las horas y aplicara las preguntas de control que en efecto serán siempre las mismas.
Yo la locura que estoy intentando desarrollar es al registrar los clientes, (tal cliente tal día a tal hora) pues en el paso final justo antes de que venga el menú final que te pregunta si quieres volver atrás, o si quieres ir al menu principal o si quieres ir al otro bat que no es para registrar fechas si no para buscar citas ya concertadas y demás. Entonces mi idea es, justo antes de que llegue ese "menu final" pues meter un CALL y que lo lleve pues a esto xD:
:cuestionarioss set carpeta=C:\Users\maria\Desktop\Oficina\Gestor_de_citas\Cuestionario_dsps_citas pushd %carpeta% cd cuestionarios if exist %fechasMUL%.text (call :AGREGAR) else (call :CREAR) :CREAR echo -------------------------%fechasMUL%--------------------- >Cuestionario_del_dia_%fechasMUL%.text echo ========================================================= >>Cuestionario_del_dia_%fechasMUL%.text cd.. echo @echo off>%fechasMUL%.bat echo title ARchivo bat por dias>>%fechasMUL%.bat echo color ED>>%fechasMUL%.bat echo cd cuestionarios>>%fechasMUL%.bat echo echo.>>%fechasMUL%.bat echo echo Hola, hoy %fechasMul% has tenido estas citas:>>%fechasMUL%.bat :AGREGAR Echo Por favor escriba ortograficamente correto el Nombre sin barras bajas para generar el cuestionario post cita. set /p Nombre=Escriba el Nombre : set /p apartado=1.Prviado 2.Asociacion 3.Colaboraciones : if %apartado%==1 (set aprt=PRIVADO) if %apartado%==2 (set aprt=ASOCIACION) if %apartado%==3 (set aprt=COLABORACIONES) set /p V500=Escriba por favor, La primera letra del nombre y la primera del apellido en mayuscula y un numero aleatorio de mas de una cifra: echo echo ---------------------%H_4%:%M_3%------------------- >>%fechasMUL%.bat echo echo A las %H_4%:%M_3% tenias programada una cita con %Nombre%>>%fechasMUL%.bat cd cuestionarios echo echo ---------------------%H_4%:%M_3%------------------- >>Cuestionario_del_dia_%fechasMUL%.text echo echo %Nombre% Apartado: %aprt% >>Cuestionario_del_dia_%fechasMUL%.text cd.. echo :%V500%_cuestion1>>%fechasMUL%.bat echo set cuestion1=jfoadif >>%fechasMUL%.bat echo set /p cuestion1=Esta cita ha sido cancelada?: 1.Si 2.No >>%fechasMUL%.bat echo if %cuestion1%==jfoadif (goto cuestion1) >>%fechasMUL%.bat echo if %cuestion1%==1 (goto %V500%si1) >>%fechasMUL%.bat echo if %cuestion1%==2 (goto %V500%no1) else (echo no corresponde) >>%fechasMUL%.bat echo goto %V500%cuestion1 >>%fechasMUL%.bat echo :%V500%si1 >>%fechasMUL%.bat echo echo ok cita cancelada >>%fechasMUL%.bat echo echo Esta cita ha sido cancelada.>> Cuestionario_del_dia_%fechasMUL%.text >>%fechasMUL%.bat echo goto siguiente_nombre1 >>%fechasMUL%.bat echo :%V500%no1 >>%fechasMUL%.bat echo set /p cuestion11=Esta cita ha sido postpuesta?: 1.Si 2.No >>%fechasMUL%.bat echo if %cuestion11%==1 (goto %V500%si2) >>%fechasMUL%.bat echo if %cuestion11%==2 (goto %V500%no2) >>%fechasMUL%.bat echo :%V500%si11 >>%fechasMUL%.bat echo set /p cuestion111="Para que fecha?(00/00/00) :" >>%fechasMUL%.bat echo echo Esta cita ha sido postpuesta para el %cuestion111%. >>Cuestionario_del_dia_%fechasMUL%.text >>%fechasMUL%.bat echo goto %V500%siguiente_nombre1 >>%fechasMUL%.bat echo :%V500%no11 >>%fechasMUL%.bat echo goto %V500%siguiente_cuestion2 >>%fechasMUL%.bat echo :%V500%siguiente_cuestion2 >>%fechasMUL%.bat echo set /p cuestion2=Se ha realizado el pago de la sesion? : 1.Si 2.No >>%fechasMUL%.bat echo if %cuestion2%==1 (goto si2) >>%fechasMUL%.bat echo if %cuestion2%==2 (goto no2) >>%fechasMUL%.bat echo :%V500%si2 echo set /p cuestion22=1.Pago Efectivo 2.Pago Transferencia 3.Bizum 4.Otra >>%fechasMUL%.bat echo if %cuestion22%==1 (set cuestion22=efectivo) >>%fechasMUL%.bat echo if %cuestion22%==2 (set cuestion22=transferencia) >>%fechasMUL%.bat echo if %cuestion22%==3 (set cuestion22=bizum) >>%fechasMUL%.bat echo if %cuestion22%==4 () >>%fechasMUL%.bat echo "echo Ha realizado el pago correctamente en %cuestion222% >>Cuestionario_del_dia_%fechasMUL%.text" >>%fechasMUL%.bat echo :%V500%no2 echo set /p cuestion221=A continuación deja constancia de cuando pagara o de lo que quieras : >>%fechasMUL%.bat echo "echo Esta cita se ha quedado pendiente del pago. >>Cuestionario_del_dia_%fechasMUL%.text" >>%fechasMUL%.bat echo "echo Se ha dejado constancia de : %cuestion221% >>Cuestionario_del_dia_%fechasMUL%.text" >>%fechasMUL%.bat echo echo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >>%fechasMUL%.bat echo :%V500%siguiente_nombre >>%fechasMUL%.bat
Y intentare crear otro bat para que vaya autodestruyendo cuando ya el cuestionario del día quede relleno y solo se quede el documento de texto en su carpeta correspondiente.
Si te fijas lo primero que hago es crear un Archivo de text vacio que se llama (fecha) desde el bat principal (el gestor de citas) y a continuación gracias a ese archivo genero múltiples (fechas).bat diarios, que la función de esos bat seria hacer las preguntas de control de todos los clientes de ese día . jeje
- Compartir respuesta