[Ayuda] Guardar Información en Batch

Iniciado por Mr. Bit, 14 Mayo 2019, 00:34 AM

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

Mr. Bit

Buenas! Este es el primer post que subo a este Foro. Soy muy nuevo en el tema de Batch. Bueno, no realmente "nuevo", ya que lo conozco y me se algunos comandos desde hace años ya. Sin embargo, nunca he podido avanzar mucho con Batch. Tengo ganas de crear programas interesantes, pero por causa de mi desconocimiento, no puedo.

Mi duda es: ¿Como guardo información dentro de un Batch?
La pregunta no se entiende bien así dicha, así que decidí realizar un par de ejemplos:

Imaginemos que en el Batch dice que mi dinero es $500. Me compro una tarjeta gráfica (en el Batch claro, todo virtual) que vale $100.

Quiero que haya un valor que sea por ejemplo %dinero% pero totalmente fijo. Si tengo $500 y gasto $100  me quedan $400. Y que eso se guarde. Que no vuelva a tener $500 de vuelta. Son solo ejemplos.

Tristemente para mi, no se mucho de programación, por lo tanto no se como expresar de manera limpia y ordenada mi duda. Lo mas parecido que he hecho fue Pawno, aunque todos los códigos y programas son bastante parecidos.

Espero que en este Foro pueda aprender mas de lo que ya se. Muchas gracias de ante mano y saludos!

EdePC

Saludos,

- Es cierto que no es fácil encontrar cursos o tutoriales de cmd o batch "de calidad", jeje siempre hay textos feos y desordenados.

- Yo te recomendaría leerte este Tutorial, tiene buena calidad de edición y explicación (incluye pdf descargable):
https://sites.google.com/site/nikos3194rfcindex/home/batch

- Otros manuales de Batch/Cmd básicos de regular calidad (debido al lenguaje XD) es:
https://openlibra.com/es/book/cmd-sin-secretos-v-2

- Luego puedes pasarte a leer los manuales de SirDarckcat:
https://foro.elhacker.net/scripting/programacion_batch_avanzada_nuevo-t132924.0.html

- También tener a mano la referencia completa de Bacth/Cmd en inglés:
https://ss64.com/nt/

- Para dudas puntuales tienes este foro, pero recomendaría googlear tus dudas, por ejemplo StackOverflow es muy buena fuente.

- Siempre puedes hacer pruebas en tu consola (línea de comandos o Símbolo del Sistema), por ejemplo:

-- Guardo 500 en un archivo de texto billetera usando la clásica redirección
-- Reviso que contiene el archivo anterior
-- Creo una variable dinero y redirecciono el contenido del archivo billetera a dicha variable
-- Reviso que contiene mi variable
-- Hago una operación matemática con mi variable, restandole 100
-- Vuelvo a revisar el contenido de mi variable
-- Guardo el valor de mi variable al archivo billetera.txt
-- Reviso el contenido del archivo billetera.txt

c:\Users\EdSon\Desktop>echo 500 > billetera.txt

c:\Users\EdSon\Desktop>type billetera.txt
500

c:\Users\EdSon\Desktop>set /p dinero=<billetera.txt

c:\Users\EdSon\Desktop>set dinero
dinero=500

c:\Users\EdSon\Desktop>set /a dinero= dinero - 100
400
c:\Users\EdSon\Desktop>set dinero
dinero=400

c:\Users\EdSon\Desktop>echo %dinero% > billetera.txt

c:\Users\EdSon\Desktop>type billetera.txt
400

c:\Users\EdSon\Desktop>

Nucleorion

Que recopilación tan buena! Gracias!

Mr. Bit

Gracias EdePC!

Lo que pasa es que yo no se muchas cosas de Batch, como ya he dicho anteriormente. No se como crear una Variable en Batch.

También, y como me pasaba con Pawno (programa mencionado en el post), no se EXACTAMENTE como funcionan las Variables o para que sirven.
Si pueden decirme como crear una en Batch y explicarme de manera sencilla y clara que es una Variable, se los agradecería un montón.

Gracias de vuelta y espero sus respuestas!  ;D

Nucleorion

#4
La pregunta es bastante basica y generica. Como casi nunca puedo responder a las preguntas complejas aprovechare para hacer mi aportación, y aunque mis conocimientos son limitados si que tengo mucha practica en iniciar a la gente en la programación en mi trabajo. La explicación te servira para cualquier lenguaje de programación, aunque en el ejemplo usaremos batch tal y como preguntas en el asunto. Voy a suponer tambien que has buscado por internet y no has comprendido las respuestas.

Una variable es un lugar donde guardar datos. Imaginemos que quieres hacer un programa que le diga al usuario cuantos dias cumple el dia de su cumpleaños (imaginando para simplificar que todos los años tienen 365 dias). Nuestro programa tendrá que multiplicar los años por los dias del año, pero como los años que tiene el usuario pueden variar le preguntaremos al usuario y los almacenamos en una variable que en este caso le llamaremos aniosusuario.

Crear una variable y darle un valor se hace asi:
Código (dos) [Seleccionar]
set dias=365
Aunque en este caso el valor no varie tiene ciertas ventajas usar variables aquí tambien.

Y para preguntar al usuario cuantos años tiene y almacenar el valor en una variable para operar con ella seria asi:
Código (dos) [Seleccionar]
set /p aniosusuario=Cuantos años has cumplido hoy?

Aqui el programa completo:
Código (dos) [Seleccionar]
@echo off
:inicio
cls
set /p aniosusuario=Cuantos años has cumplido hoy?
set dias=365
set /a resultado=%aniosusuario% * %dias%
echo tienes %resultado% dias
pause
goto inicio


Aqui el programa comentando lo que hace cada linea:
Código (dos) [Seleccionar]
@echo off

REM Ponemos REM para crear un comentario, no tiene incidencia en el programa, es solo para guia del programador

REM Ponemos una etiqueta llamada inicio para que cuando acabe el programa con goto vuelva a inicio y comience de nuevo
:inicio

REM con cls borramos la pantalla cada vez
cls

REM Preguntamos al usuario cuantos años tiene y lo guardamos en la variable años que creamos con set
set /p aniosusuario=Cuantos años has cumplido hoy?

REM creamos la variable dias y le asignamos el valor
set dias=365

REM para operar con las variables creadas ponemos % al principio y al final de la variable
set /a resultado=%aniosusuario% * %dias%

REM aqui mostramos el resultado intercalando el texto con la variable poniendo tambien %
echo tienes %resultado% dias

REM paramos el programa para que el usuario pueda ver el resultado hasta que pulse una tecla
pause

REM volvemos al punto de partida que está en la etiqueta inicio
goto inicio


Consideraciones a tener en cuenta:
Los valores almacenados en las variables se destruyen al cerrar el programa o al recalcular o reasignar los valores.
Los lenguajes de programación no suelen operar internamente con ñ ni acentos por lo que no los usaremos.

PD:
Código (dos) [Seleccionar]

En la previsualizacion, porque la escribir años aparece asi: a& # 241;os y al escribir  a n i o s  aparece asi: años?

Bueno se descompone todo al guardar y luego al previsualizar se vuelve a descomponer asi que no se si se me entendera


Mr. Bit

Muchas gracias! En serio!

Si, eso de los "%ejemplo%", lo de "set /p" y todo lo basico me lo se. No sabia como crear una variable, pero ahora si me ha quedado claro gracias a ti!

Una pregunta: ¿Que puedo colocar en el Valor de una variable?

set variable=(Aquí que puedo colocar)

Nucleorion

numeros y letras.

Ahora con lo aprendido haz pruebas y vete haciendo versiones del programa. Por ejemplo que te pregunte tu nombre y luego que te diga pepito tiene 10526 dias. Si guardas las versiones con nombres diferentes no vas a romper ni perder nada por hacer todas las pruebas que quieras.


Mr. Bit

Gracias! Y dime ¿Las variables deben ser escritas al principio del codigo o en donde se escriba no afecta nada?

Nucleorion

en batch basta con crearlas antes de usarlas

Eleкtro

#9
De por si, lo primero que en mi opinión cualquier persona te debería aconsejar, es usar cualquier otro lenguaje distinto a Batch. Tienes VisualBasicScript y PowerShell nativamente soportados en Windows, siendo ese último infinitamente más sofisticado (y no por ello más dificil de usar) que los dos anteriores.

Aparte, la manipulación de un archivo local con la única finalidad de almacenar 1 valor, lo veo completamente engorroso e innecesario. En otros casos y para otros lenguajes podría ser razonable, desde luego, mediante la serialización de objetos o a pelo escribiendo en un archivo de texto plano de inicialización (.ini), pero estamos hablando de Batch, y crear dependencias de archivos de texto plano para almacenar un único valor...
En su lugar, puedes manipular una variable de entorno. O como alternativa, manipular directamente una entrada en el registro de Windows. Esto último es tedioso hacerlo en Batch por que dependes de un programa externo (como para casi todo lo demás), REG.EXE para poder realizar operaciones de lectura y escritura en el registro. Te recomiendo cualquier otro lenguaje, insisto.

Por último, te muestro un ejemplo de batch-script utilizando una variable de entorno personalizada en la que puedes almacenar un valor de forma permanente...

Código (dos) [Seleccionar]
@ECHO OFF

:: Nombe de variable de entorno a definir en el sistema.
SET "envVarName=GLOBAL_MONEY"

:: Obtener valor actual de variable de entorno.
FOR /F "TOKENS=3 DELIMS=^ " %%# in (
'REG QUERY "HKCU\Environment" ^| FINDSTR /I "\<%envVarName%\>"'
) DO (
SET /A "CURRENT_MONEY=%%#"
)2>NUL
ECHO.Valor actual: %CURRENT_MONEY%

:: Añadir $500
SET /A "CURRENT_MONEY=%CURRENT_MONEY%" + 500
ECHO.Valor nuevo: %CURRENT_MONEY%

:: Guardar los cambios en la variable de entorno.
(SETX "%envVarName%" "%CURRENT_MONEY%")1>NUL

PAUSE
EXIT /B 0





Por cierto, yo también publiqué una guía de aprendizaje de Batch:
...pero no me apateció acabarlo por desmotivación.

Saludos.