Le fichier batch comprend un fichier externe pour les variables

98

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

Pablo
la source
Implémentation de la mine: stackoverflow.com/questions/46147450/…
Andry

Réponses:

133

Remarque: je suppose que les fichiers batch Windows car la plupart des gens semblent ne pas savoir qu'il existe des différences significatives et appellent tout aveuglément avec du texte gris sur fond noir DOS. Néanmoins, la première variante devrait également fonctionner sous DOS.

Configuration exécutable

Le moyen le plus simple de le faire est de simplement placer les variables dans un fichier batch elles-mêmes, chacune avec sa propre setinstruction:

set var1=value1
set var2=value2
...

et dans votre lot principal:

call config.cmd

Bien sûr, cela permet également de créer des variables de manière conditionnelle ou en fonction des aspects du système, donc c'est assez polyvalent. Cependant, du code arbitraire peut y être exécuté et s'il y a une erreur de syntaxe, votre lot principal se fermera également. Dans le monde UNIX, cela semble être assez courant, en particulier pour les shells. Et si tu y penses,autoexec.bat n'y a rien d'autre.

Paires clé / valeur

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

var1=value1
var2=value2
...

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

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

Cela utilise une astuce similaire à la précédente, à savoir simplement utiliser setsur chaque ligne. Les citations sont là pour échapper à des choses comme <, >, &, |. Cependant, ils se cassent eux-mêmes lorsque des guillemets sont utilisés dans l'entrée. De plus, 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 à une entrée arbitraire pour ne causer aucun mal de tête ou problème dans les fichiers batch 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 transférez cette responsabilité à celui qui écrit le fichier de configuration.

Joey
la source
Cela n'a pas fonctionné pour moi, pouvez-vous s'il vous plaît vérifier: stackoverflow.com/questions/46147450/…
Naguib Ihab
35

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

call externalconfig.bat

à l'intérieur de 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
chalup
la source
Cela n'a pas fonctionné pour moi, pouvez-vous s'il vous plaît vérifier: stackoverflow.com/questions/46147450/…
Naguib Ihab
Si vous utilisez le fichier de configuration dans un autre script en parallèle (en l'appelant avec call, ce qui est synchrone btw), cela indique que "le processus ne peut pas accéder au fichier car il est utilisé" et ne peut pas être appelé.
domih
2

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

>file.ext

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

>>file.ext

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

(
echo
echo
)<file.ext

Cela exécutera les paramètres basés sur les lignes du fichier. Dans ce cas, nous utilisons deux lignes qui seront tapées en utilisant "echo". Le crochet gauche touchant le crochet droit des parenthèses signifie que les informations de ce fichier seront redirigées vers ces lignes.

J'ai compilé un fichier d'exemple en lecture / écriture. Vous trouverez ci-dessous le fichier divisé en sections pour expliquer ce que fait chaque partie.

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

SRU peut être n'importe quoi dans cet exemple. Nous le configurons en fait pour éviter un crash 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 une forme courte pour "Command Database". Vous pouvez utiliser n'importe quelle extension. La section suivante consiste à tester le code à partir de zéro. Nous ne voulons pas utiliser les variables définies qui ont été exécutées au début du fichier, nous voulons en fait qu'elles se chargent À PARTIR du fichier settings.cdb que nous venons d'écrire.

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

Donc, nous avons juste envoyé les deux premières lignes d'informations que vous avez écrites au début du fichier (que vous avez la possibilité d'ignorer la définition des lignes à vérifier pour vous assurer que cela fonctionne) pour 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 lors du transfert de settings.cdb entre parenthèses. En tant que facteur de motivation supplémentaire pour un bon travail, appuyez sur Entrée et définissez les valeurs par défaut que nous avons définies plus tôt comme «1» pour renvoyer un bon message de travail. L'utilisation des tubes de support va dans les deux sens, et est beaucoup plus facile que de régler le truc "POUR". :)

Sev3nClouds
la source
1

Alors tu dois juste faire ça 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
Le réparateur
la source
0
:: 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

Production:

$ RunCount = 1

$ RunCount = 2

$ RunCount = 3

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

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

Amr Ali
la source
0

Un sujet assez ancien mais j'avais la même question il y a quelques jours et j'ai eu une autre idée (peut-être que quelqu'un la trouvera toujours utile)

Par exemple, vous pouvez créer un 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 batch:

@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 complètement avec 'call config.bat all' ou en n'appelant que des parties de celui-ci (voir l'exemple ci-dessous) L'idée ici est que parfois est plus pratique lorsque vous avez la possibilité de ne pas tout appeler à une fois que. Certaines variables ne veulent peut-être pas encore être appelées afin que vous puissiez 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 la façon dont les autres m'aident ici 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.

Sygmond
la source
-2

N'oublions pas les bons vieux paramètres. Lorsque vous démarrez votre fichier * .bat ou * .cmd, vous pouvez ajouter jusqu'à neuf paramètres après le nom du fichier de commande:

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

Exemple de script

Le myscript.bat pourrait être quelque chose comme ceci:

@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

Exemple de sortie

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:\>
Ciove
la source
-3

En essayant d'utiliser la méthode avec une configuration excutable, j'ai remarqué que cela peut fonctionner ou ne PAS fonctionner en fonction de l'emplacement de l'appel dans le script:

appeler config.cmd

Je sais que ça n'a aucun sens, mais pour moi c'est un fait. Lorsque "call config.cmd" est situé en haut du script, cela fonctionne, mais si plus loin dans le script, ce n'est pas le cas.

Par ne fonctionne pas, je veux dire que la variable n'est pas définie dans le script appelant.

Très très étrange !!!!

phil dix
la source