Pregunta El archivo por lotes incluye un archivo externo para las variables


Tengo un archivo por lotes y quiero incluir un archivo externo que contenga algunas variables (por ejemplo, variables de configuración). ¿Es posible?


76
2018-05-04 08:41


origen


Respuestas:


Nota: Supongo que los archivos por lotes de Windows ya que la mayoría de la gente parece ignorar que existen diferencias significativas y simplemente llaman ciegamente todo con texto gris sobre fondo negro. Sin embargo, la primera variante debería funcionar en DOS también.

Configuración ejecutable

La forma más sencilla de hacerlo es simplemente colocar las variables en un archivo por lotes, cada una con su propio set declaración:

set var1=value1
set var2=value2
...

y en tu lote principal:

call config.cmd

Por supuesto, eso también permite que las variables se creen condicionalmente o dependiendo de los aspectos del sistema, por lo que es bastante versátil. Sin embargo, el código arbitrario puede ejecutarse allí y si hay un error de sintaxis, su lote principal también saldrá. En el mundo de UNIX esto parece ser bastante común, especialmente para las conchas. Y si lo piensas, autoexec.bat no es nada más

Pares clave / valor

Otra forma sería algún tipo de var=value pares en el archivo de configuración:

var1=value1
var2=value2
...

A continuación, puede usar el siguiente fragmento para cargarlos:

for /f "delims=" %%x in (config.txt) do (set "%%x")

Esto utiliza un truco similar al anterior, es decir solo usar set en cada línea. Las citas están ahí para escapar cosas como <, >, &, |. Sin embargo, ellos mismos se romperán cuando se usen comillas en la entrada. También siempre debe tener cuidado cuando procesa datos en variables almacenadas con dichos caracteres.

En general, me parece bastante imposible escapar automáticamente de la entrada arbitraria para no causar dolores de cabeza o problemas en los archivos por lotes. Al menos no encontré la manera de hacerlo todavía. Por supuesto, con la primera solución, estás aplicando esa responsabilidad al que está escribiendo el archivo de configuración.


103
2018-05-04 08:47



Si el archivo de configuración externo también es un archivo por lotes válido, puede usar:

call externalconfig.bat

dentro de tu script Intenta crear el siguiente a.bat:

@echo off
call b.bat
echo %MYVAR%

y b.bat:

set MYVAR=test

Ejecutar a.bat debería generar resultados:

test

29
2018-05-04 08:48



Lote utiliza los corchetes menor que y mayor que los tubos de entrada y salida.

>file.ext

Usar solo un paréntesis de salida como el anterior sobreescribirá toda la información en ese archivo.

>>file.ext

Usar el doble corchete derecho agregará la siguiente línea al archivo.

(
echo
echo
)<file.ext

Esto ejecutará los parámetros basados ​​en las líneas del archivo. En este caso, estamos usando dos líneas que se escribirán usando "eco". El corchete izquierdo tocando el corchete de paréntesis derecho significa que la información de ese archivo se canalizará a esas líneas.

He compilado un archivo de lectura / escritura de solo ejemplo. A continuación se muestra el archivo dividido en secciones para explicar lo que hace cada parte.

@echo off
echo TEST R/W
set SRU=0

SRU puede ser cualquier cosa en este ejemplo. De hecho, lo estamos configurando para evitar un bloqueo si presiona Intro demasiado rápido.

set /p SRU=Skip Save? (y): 
if %SRU%==y goto read
set input=1
set input2=2
set /p input=INPUT: 
set /p input2=INPUT2: 

Ahora, necesitamos escribir las variables en un archivo.

(echo %input%)> settings.cdb
(echo %input2%)>> settings.cdb
pause

Uso .cdb como una forma abreviada de "Base de datos de comandos". Puedes usar cualquier extensión. La siguiente sección es probar el código desde cero. No queremos utilizar las variables establecidas que se ejecutaron al principio del archivo, de hecho queremos que se carguen desde la configuración que acabamos de escribir.

:read
(
set /p input=
set /p input2=
)<settings.cdb

Entonces, acabamos de canalizar las primeras dos líneas de información que escribió al principio del archivo (que tiene la opción de omitir el establecimiento de las líneas para verificar que funcionen) para establecer las variables de entrada y entrada2.

echo %input%
echo %input2%
pause
if %input%==1 goto newecho
pause
exit

:newecho
echo If you can see this, good job!
pause
exit

Esto muestra la información que se configuró mientras settings.cdb se introdujo en el paréntesis. Como un motivador adicional para un buen trabajo, presionar Enter y establecer los valores predeterminados que configuramos anteriormente como "1" devolverá un buen mensaje de trabajo. Usar los tubos de soporte va en ambos sentidos, y es mucho más fácil que configurar las cosas "A FAVOR". :)


2
2017-07-23 20:29



¿Entonces solo tienes que hacer esto bien ?:

@echo off
echo text shizzle
echo.
echo pause^>nul (press enter)
pause>nul

REM writing to file
(
echo XD
echo LOL
)>settings.cdb
cls

REM setting the variables out of the file
(
set /p input=
set /p input2=
)<settings.cdb
cls

REM echo'ing the variables
echo variables:
echo %input%
echo %input2%
pause>nul

if %input%==XD goto newecho
DEL settings.cdb
exit

:newecho
cls
echo If you can see this, good job!
DEL settings.cdb
pause>nul
exit

1
2017-09-27 16:04



:: savevars.bat
:: Use $ to prefix any important variable to save it for future runs.

@ECHO OFF
SETLOCAL

REM Load variables
IF EXIST config.txt FOR /F "delims=" %%A IN (config.txt) DO SET "%%A"

REM Change variables
IF NOT DEFINED $RunCount (
    SET $RunCount=1
) ELSE SET /A $RunCount+=1

REM Display variables
SET $

REM Save variables
SET $>config.txt

ENDLOCAL
PAUSE
EXIT /B

Salida:

$ RunCount = 1

$ RunCount = 2

$ RunCount = 3

La técnica descrita anteriormente también se puede usar para compartir variables entre múltiples archivos por lotes.

Fuente: http://www.incodesystems.com/products/batchfi1.htm


0
2017-11-25 05:26



No olvidemos buenos viejos parámetros. Al iniciar su archivo * .bat o * .cmd, puede agregar hasta nueve parámetros después del nombre del archivo de comando:

call myscript.bat \\path\to\my\file.ext type
call myscript.bat \\path\to\my\file.ext "Del /F"

Script de ejemplo

El myscript.bat podría ser algo como esto:

@Echo Off
Echo The path of this scriptfile %~0
Echo The name of this scriptfile %~n0
Echo The extension of this scriptfile %~x0
Echo.
If "%~2"=="" (
   Echo Parameter missing, quitting.
   GoTo :EOF
)
If Not Exist "%~1" (
   Echo File does not exist, quitting.
   GoTo :EOF
)
Echo Going to %~2 this file: %~1
%~2 "%~1"
If %errorlevel%  NEQ 0 (
   Echo Failed to %~2 the %~1.
)
@Echo On

Ejemplo de salida

c:\>c:\bats\myscript.bat \\server\path\x.txt type
The path of this scriptfile c:\bats\myscript.bat
The name of this scriptfile myscript
The extension of this scriptfile .bat

Going to type this file: \\server\path\x.txt
This is the content of the file:
Some alphabets: ABCDEFG abcdefg
Some numbers: 1234567890

c:\>c:\bats\myscript.bat \\server\path\x.txt "del /f "
The path of this scriptfile c:\bats\myscript.bat
The name of this scriptfile myscript
The extension of this scriptfile .bat

Going to del /f  this file: \\server\path\x.txt

c:\>

-1
2018-04-27 12:11



Al intentar usar el método con configuración excutable Noté que puede funcionar o NO funcionar dependiendo de en qué parte del script se encuentra la llamada:

llamar a config.cmd

Sé que no tiene ningún sentido, pero para mí es un hecho. Cuando "call config.cmd" se encuentra en la parte superior del script, funciona, pero si está más adelante en el script, no funciona.

Por no funciona, me refiero a que la variable no está configurada como el script de llamada.

Muy muy extraño !!!!


-2
2018-05-25 23:49