web-dev-qa-db-fra.com

Le fichier batch comprend un fichier externe pour les variables

J'ai un fichier de commandes et je veux inclure un fichier externe contenant des variables (par exemple des variables de configuration). C'est possible?

79
Pablo

Remarque: Je suppose qu'il existe des fichiers de commandes Windows car la plupart des gens ne semblent pas être conscients qu'il existe des différences significatives. Néanmoins, la première variante devrait également fonctionner sous DOS.

Configuration exécutable

La façon la plus simple de procéder consiste simplement à placer les variables dans un fichier batch, chacune avec sa propre instruction set:

set var1=value1
set var2=value2
...

et dans votre lot principal:

call config.cmd

Bien entendu, cela permet également de créer des variables de manière conditionnelle ou en fonction des aspects du système, ce qui en fait un outil très polyvalent. Cependant, du code arbitraire peut y être exécuté et en cas d'erreur de syntaxe, votre lot principal sera également supprimé. Dans le monde UNIX, cela semble être assez courant, en particulier pour les coques. Et si vous y réfléchissez, autoexec.bat n’est rien d’autre.

Paires clé/valeur

Une autre façon serait une sorte de paires var=value dans le fichier de configuration:

var1=value1
var2=value2
...

Vous pouvez ensuite utiliser l'extrait suivant pour les charger:

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

Ceci utilise une astuce similaire à celle d’avant, à savoir utiliser simplement set sur chaque ligne. Les guillemets sont là pour échapper à des choses comme <, >, &, |. Cependant, ils se cassent quand des guillemets sont utilisés dans l'entrée. Aussi, vous devez toujours faire attention lors du traitement ultérieur des données dans les variables stockées avec de tels caractères.

Généralement, échapper automatiquement à des entrées arbitraires pour ne pas causer de maux de tête ou de problèmes dans les fichiers de commandes me semble assez impossible. Au moins, je n'ai pas encore trouvé le moyen de le faire. Bien sûr, avec la première solution, vous confiez cette responsabilité à celui qui écrit le fichier de configuration.

109
Joey

Si le fichier de configuration externe est également un fichier de commandes valide, vous pouvez simplement utiliser:

call externalconfig.bat

dans votre script. Essayez de créer après a.bat:

@echo off
call b.bat
echo %MYVAR%

et b.bat:

set MYVAR=test

L'exécution de a.bat devrait générer une sortie:

test
28
chalup

Batch utilise les crochets inférieur et supérieur à comme canalisations d'entrée et de sortie.

>file.ext

L'utilisation d'un seul support de sortie, comme ci-dessus, écrasera toutes les informations contenues dans ce fichier.

>>file.ext

L'utilisation du double crochet à droite ajoutera la ligne suivante au fichier.

(
echo
echo
)<file.ext

Cela exécutera les paramètres en fonction des lignes du fichier. Dans ce cas, nous utilisons deux lignes qui seront saisies avec "echo". Le crochet de gauche touchant le crochet de parenthèse droit signifie que les informations de ce fichier seront acheminées dans ces lignes. 

J'ai compilé un fichier en lecture/écriture contenant uniquement des exemples. Le fichier ci-dessous est divisé en sections pour expliquer le rôle de chaque partie.

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

SRU peut être n'importe quoi dans cet exemple. En fait, nous le configurons pour éviter un blocage si vous appuyez trop rapidement sur Entrée.

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: 

Maintenant, nous devons écrire les variables dans un fichier.

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

J'utilise .cdb comme forme abrégée de "Base de données de commandes". Vous pouvez utiliser n’importe quelle extension ..__ La prochaine section consiste à tester le code à partir de zéro. Nous ne souhaitons pas utiliser les variables d'ensemble qui ont été exécutées au début du fichier, nous souhaitons en réalité qu'elles chargent FROM le fichier settings.cdb que nous venons d'écrire.

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

Donc, nous venons de filtrer les deux premières lignes d'informations que vous avez écrites au début du fichier (vous avez la possibilité d'ignorer le réglage des lignes pour vérifier qu'elles fonctionnent bien) afin de définir les variables d'entrée et d'entrée2.

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

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

Cela affiche les informations qui ont été définies lorsque settings.cdb a été canalisé dans la parenthèse. En tant que facteur de motivation supplémentaire, appuyer sur Entrée pour définir les valeurs par défaut définies par "1" renvoie un message indiquant le bon travail . " des trucs. :)

2
Sev3nClouds

Donc vous devez juste faire cela correctement?

@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
THEfixer
:: 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

Sortie:

$ RunCount = 1

$ RunCount = 2

$ RunCount = 3

La technique décrite ci-dessus peut également être utilisée pour partager des variables entre plusieurs fichiers de commandes. 

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

0
Amr Ali

Un peu vieux sujet mais j'avais la même question il y a quelques jours et je suis venu avec une autre idée (peut-être que quelqu'un le trouvera toujours utile)

Par exemple, vous pouvez créer un fichier config.bat avec différents sujets (famille, taille, couleur, animaux) et les appliquer individuellement dans n’importe quel ordre où vous le souhaitez dans vos scripts de lot:

@echo off
rem Empty the variable to be ready for label config_all
set config_all_selected=

rem Go to the label with the parameter you selected
goto :config_%1

REM This next line is just to go to end of file 
REM in case that the parameter %1 is not set
goto :end

REM next label is to jump here and get all variables to be set
:config_all
set config_all_selected=1


:config_family
set mother=Mary
set father=John
set sister=Anna
rem This next line is to skip going to end if config_all label was selected as parameter
if not "%config_all_selected%"=="1" goto :end

:config_test
set "test_parameter_all=2nd set: The 'all' parameter WAS used before this echo"
if not "%config_all_selected%"=="1" goto :end

:config_size
set width=20
set height=40
if not "%config_all_selected%"=="1" goto :end


:config_color
set first_color=blue
set second_color=green
if not "%config_all_selected%"=="1" goto :end


:config_animals
set dog=Max
set cat=Miau
if not "%config_all_selected%"=="1" goto :end


:end

Après cela, vous pouvez l’utiliser n’importe où en appelant à fond avec 'call config.bat all' ou en n’en appelant que certaines parties (voir l’exemple ci-dessous) L’idée ici est qu’il est parfois plus pratique de ne pas choisir. appeler tout à la fois. Certaines variables que vous ne voulez peut-être pas être appelé pour pouvoir les appeler plus tard.

Exemple test.bat

@echo off

rem This is added just to test the all parameter
set "test_parameter_all=1st set: The 'all' parameter was NOT used before this echo"

call config.bat size

echo My birthday present had a width of %width% and a height of %height%

call config.bat family
call config.bat animals

echo Yesterday %father% and %mother% surprised %sister% with a cat named %cat%
echo Her brother wanted the dog %dog%

rem This shows you if the 'all' parameter was or not used (just for testing)
echo %test_parameter_all%

call config.bat color

echo His lucky color is %first_color% even if %second_color% is also Nice.

echo.
pause

J'espère que cela aide les autres à m'aider avec leurs réponses.

Une version courte de ce qui précède:

config.bat

@echo off
set config_all_selected=
goto :config_%1
goto :end

:config_all
set config_all_selected=1

:config_family
set mother=Mary
set father=John
set daughter=Anna
if not "%config_all_selected%"=="1" goto :end

:config_size
set width=20
set height=40
if not "%config_all_selected%"=="1" goto :end

:end

test.bat

@echo off

call config.bat size
echo My birthday present had a width of %width% and a height of %height%

call config.bat family
echo %father% and %mother% have a daughter named %daughter%

echo.
pause

Bonne journée.

0
Sorin