Die Batch-Datei enthält eine externe Datei für Variablen

97

Ich habe eine Batch-Datei und möchte eine externe Datei einschließen, die einige Variablen enthält (z. B. Konfigurationsvariablen). Ist es möglich?

Pablo
quelle

Antworten:

131

Hinweis: Ich gehe von Windows-Batchdateien aus, da die meisten Leute anscheinend nicht wissen, dass es signifikante Unterschiede gibt, und einfach blind alles mit grauem Text auf schwarzem Hintergrund unter DOS aufrufen. Trotzdem sollte die erste Variante auch unter DOS funktionieren.

Ausführbare Konfiguration

Der einfachste Weg, dies zu tun, besteht darin, die Variablen einfach selbst in eine Batch-Datei zu setzen, jede mit ihrer eigenen setAnweisung:

set var1=value1
set var2=value2
...

und in Ihrer Hauptcharge:

call config.cmd

Auf diese Weise können Variablen natürlich auch bedingt oder abhängig von Aspekten des Systems erstellt werden, sodass es ziemlich vielseitig ist. Dort kann jedoch beliebiger Code ausgeführt werden. Wenn ein Syntaxfehler auftritt, wird auch Ihr Hauptstapel beendet. In der UNIX-Welt scheint dies ziemlich häufig zu sein, insbesondere bei Shells. Und wenn Sie darüber nachdenken, autoexec.batist nichts anderes.

Schlüssel / Wert-Paare

Ein anderer Weg wäre eine Art von var=valuePaaren in der Konfigurationsdatei:

var1=value1
var2=value2
...

Sie können dann das folgende Snippet verwenden, um sie zu laden:

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

Dies verwendet einen ähnlichen Trick wie zuvor, nämlich nur setin jeder Zeile. Die Zitate gibt es Dinge zu entkommen wie <, >, &, |. Sie werden jedoch selbst unterbrochen, wenn Anführungszeichen in der Eingabe verwendet werden. Außerdem müssen Sie immer vorsichtig sein, wenn Sie Daten in Variablen weiterverarbeiten, die mit solchen Zeichen gespeichert sind.

Im Allgemeinen scheint es mir ziemlich unmöglich, willkürlichen Eingaben automatisch zu entkommen, um keine Kopfschmerzen oder Probleme in Batch-Dateien zu verursachen. Zumindest habe ich noch keinen Weg gefunden, dies zu tun. Mit der ersten Lösung übertragen Sie diese Verantwortung natürlich auf diejenige, die die Konfigurationsdatei schreibt.

Joey
quelle
Das hat bei mir nicht funktioniert, können Sie bitte überprüfen: stackoverflow.com/questions/46147450/…
Naguib Ihab
35

Wenn die externe Konfigurationsdatei auch eine gültige Batchdatei ist, können Sie einfach Folgendes verwenden:

call externalconfig.bat

in Ihrem Skript. Versuchen Sie, folgendes a.bat zu erstellen:

@echo off
call b.bat
echo %MYVAR%

und b.bat:

set MYVAR=test

Das Ausführen von a.bat sollte folgende Ausgabe generieren:

test
Chalup
quelle
Das hat bei mir nicht funktioniert, können Sie bitte überprüfen: stackoverflow.com/questions/46147450/…
Naguib Ihab
Wenn Sie die Konfigurationsdatei parallel in einem anderen Skript verwenden (Aufruf mit call, was übrigens synchron ist), heißt es "Der Prozess kann nicht auf die Datei zugreifen, weil sie verwendet wird" und kann nicht aufgerufen werden.
Domih
2

Batch verwendet die Klammern kleiner als und größer als als Eingabe- und Ausgaberohre.

>file.ext

Wenn Sie wie oben nur eine Ausgabeklammer verwenden, werden alle Informationen in dieser Datei überschrieben.

>>file.ext

Wenn Sie die doppelte rechte Klammer verwenden, wird die nächste Zeile zur Datei hinzugefügt.

(
echo
echo
)<file.ext

Dadurch werden die Parameter basierend auf den Zeilen der Datei ausgeführt. In diesem Fall verwenden wir zwei Zeilen, die mit "echo" eingegeben werden. Die linke Klammer, die die rechte Klammer berührt, bedeutet, dass die Informationen aus dieser Datei in diese Zeilen geleitet werden.

Ich habe eine Nur-Beispiel-Lese- / Schreibdatei zusammengestellt. Unten ist die Datei in Abschnitte unterteilt, um zu erklären, was jedes Teil tut.

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

SRU kann in diesem Beispiel alles sein. Wir stellen es tatsächlich ein, um einen Absturz zu verhindern, wenn Sie zu schnell die Eingabetaste drücken.

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: 

Jetzt müssen wir die Variablen in eine Datei schreiben.

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

Ich benutze .cdb als Kurzform für "Command Database". Sie können eine beliebige Erweiterung verwenden. Im nächsten Abschnitt wird der Code von Grund auf getestet. Wir möchten nicht die Set-Variablen verwenden, die am Anfang der Datei ausgeführt wurden, sondern sie aus der soeben geschriebenen settings.cdb laden.

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

Wir haben also nur die ersten beiden Informationszeilen weitergeleitet, die Sie am Anfang der Datei geschrieben haben (Sie können die Einstellung der zu überprüfenden Zeilen überspringen, um sicherzustellen, dass sie funktioniert), um die Variablen input und input2 festzulegen.

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

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

Dies zeigt die Informationen an, die festgelegt wurden, während settings.cdb in die Klammer geleitet wurde. Als zusätzliche Motivation für einen guten Job wird durch Drücken der Eingabetaste und Festlegen der Standardwerte, die wir zuvor als "1" festgelegt haben, eine gute Jobnachricht zurückgegeben. Die Verwendung der Halterungsrohre erfolgt in beide Richtungen und ist viel einfacher als das Einstellen des "FOR" -Stücks. :) :)

Sev3nClouds
quelle
1

Also musst du das einfach richtig machen?:

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

Ausgabe:

$ RunCount = 1

$ RunCount = 2

$ RunCount = 3

Die oben beschriebene Technik kann auch verwendet werden, um Variablen für mehrere Batchdateien freizugeben.

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

Amr Ali
quelle
0

Ein bisschen altes Thema, aber ich hatte vor ein paar Tagen die gleiche Frage und kam auf eine andere Idee (vielleicht findet es noch jemand nützlich)

Sie können beispielsweise eine config.bat mit verschiedenen Themen (Familie, Größe, Farbe, Tiere) erstellen und diese einzeln in beliebiger Reihenfolge in Ihren Batch-Skripten beliebig anwenden:

@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

Danach können Sie es überall verwenden, indem Sie vollständig mit 'call config.bat all' aufrufen oder nur Teile davon aufrufen (siehe Beispiel unten). Die Idee hier ist, dass es manchmal praktischer ist, wenn Sie die Option haben, nicht alles aufzurufen Einmal. Einige Variablen möchten möglicherweise noch nicht aufgerufen werden, damit Sie sie später aufrufen können.

Beispiel 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

Ich hoffe, es hilft der Art und Weise, wie andere mir hier mit ihren Antworten helfen.

Eine kurze Version des oben genannten:

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

Schönen Tag.

Sorin
quelle
-2

Vergessen wir nicht die guten alten Parameter. Beim Starten Ihrer * .bat- oder * .cmd-Datei können Sie nach dem Namen der Befehlsdatei bis zu neun Parameter hinzufügen:

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

Beispielskript

Die myscript.bat könnte ungefähr so ​​aussehen:

@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

Beispielausgabe

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
quelle
-3

Beim Versuch, die Methode mit einer auslösbaren Konfiguration zu verwenden, habe ich festgestellt, dass sie möglicherweise funktioniert oder NICHT, je nachdem, wo sich der Aufruf im Skript befindet:

Rufen Sie config.cmd auf

Ich weiß, dass es keinen Sinn ergibt, aber für mich ist es eine Tatsache. Wenn sich "call config.cmd" oben im Skript befindet, funktioniert es, aber wenn es weiter im Skript ist, funktioniert es nicht.

Mit funktioniert nicht, ich meine, die Variablen werden nicht im aufrufenden Skript gesetzt.

Sehr sehr seltsam !!!!

phil ten
quelle