Antworten:
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.
Der einfachste Weg, dies zu tun, besteht darin, die Variablen einfach selbst in eine Batch-Datei zu setzen, jede mit ihrer eigenen set
Anweisung:
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.bat
ist nichts anderes.
Ein anderer Weg wäre eine Art von var=value
Paaren 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 set
in 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.
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
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.
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. :) :)
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
:: 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.
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.
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"
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
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:\>
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 !!!!