Eine Batch-Datei RICHTIG anfangen (setlocal oder nicht?)
Ich habe jetzt schon des öfteren verschiedene Batch-Dateien geschrieben, geändert,....
Diese Dateien haben immer mit
angefangen.
Nun sehe ich aber in diesem Forum, dass viele Batch's mit
anfangen.
Macht das einen großen Unterschied, wenn ich das "& setlocal" nicht schreibe, und was bewirkt diese Zeichenfolge/ dieser Befehl?
bastla hat mir schon einen Denkanstoß hiermit gegeben:
Daraus bin ich aber noch nicht ganz schlau geworden, und deshalb würde ich gerne noch einmal eure Hilfe in Anspruch nehmen.
Danke schonmal im Voraus
MfG Karsten
Diese Dateien haben immer mit
@echo off
Nun sehe ich aber in diesem Forum, dass viele Batch's mit
@echo off & setlocal
Macht das einen großen Unterschied, wenn ich das "& setlocal" nicht schreibe, und was bewirkt diese Zeichenfolge/ dieser Befehl?
bastla hat mir schon einen Denkanstoß hiermit gegeben:
setlocal /?
set /?
Daraus bin ich aber noch nicht ganz schlau geworden, und deshalb würde ich gerne noch einmal eure Hilfe in Anspruch nehmen.
Danke schonmal im Voraus
MfG Karsten
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 144744
Url: https://administrator.de/contentid/144744
Ausgedruckt am: 25.11.2024 um 20:11 Uhr
10 Kommentare
Neuester Kommentar
Der erste Absatz in der Hilfe von setlocal sagt doch eigentlich alles:
Der Befehl bewirkt, dass gesetzte Variablen nur innerhalb der Batch Gültigkeit haben. Sie sind also nur temporär. Nach Ende der Batch bzw. nach einem expliziten endlocal wird wieder zum Standard zurückgekehrt.
Und warum das Ganze? Innerhalb einer Batch schreibt man häufig irgendwelche Werte in Variablen um später damit weiter zu arbeiten. Schaltet man jetzt den Kontext nicht mir setlocal um, werden diese Variablen in der Benutzerumgebung gespeichert und bleiben dort auch, bis sie explizit gelöscht werden. Das wäre auf Dauer kontraproduktiv und wenig sinnvoll.
Probier's einfach mal aus und schreibe eine Batch, die irgendeine Variable setzt und zwar einmal mit und einmal ohne setlocal. Nach Abarbeiten der Batch lässt du dir mit set die Systemvariablen ausgeben und beobachtest den Unterschied.
Startet die Begrenzung des Gültigkeitsbereiches von Änderungen. Änderungen der Umgebung nach SETLOCAL sind nur auf die Batchdatei bezogen. Um die ursprünglichen Einstellungen wiederherzustellen, muss der Befehl ENDLOCAL ausgeführt werden. Beim Erreichen des Endes einer Batchdatei wird impliziertes ENDLOCAL für jegliche ausstehende SETLOCAL-Befehle ausgeführt.
Der Befehl bewirkt, dass gesetzte Variablen nur innerhalb der Batch Gültigkeit haben. Sie sind also nur temporär. Nach Ende der Batch bzw. nach einem expliziten endlocal wird wieder zum Standard zurückgekehrt.
Und warum das Ganze? Innerhalb einer Batch schreibt man häufig irgendwelche Werte in Variablen um später damit weiter zu arbeiten. Schaltet man jetzt den Kontext nicht mir setlocal um, werden diese Variablen in der Benutzerumgebung gespeichert und bleiben dort auch, bis sie explizit gelöscht werden. Das wäre auf Dauer kontraproduktiv und wenig sinnvoll.
Probier's einfach mal aus und schreibe eine Batch, die irgendeine Variable setzt und zwar einmal mit und einmal ohne setlocal. Nach Abarbeiten der Batch lässt du dir mit set die Systemvariablen ausgeben und beobachtest den Unterschied.
Hi Karsten,
das ganze hatte ich mal hier Verwenden von Setlocal ... ein bisschen angerissen.
Gruß Phil
das ganze hatte ich mal hier Verwenden von Setlocal ... ein bisschen angerissen.
Gruß Phil
hi, das macht mich jetzt auch ein bisschen stutzig, wenn ich einfach mal in ner batch schreibe:
und dann ein neues CMD Fenster auf mache und die Vatiable test mit
abfrage, dann bekomme ich %test% zurück. Nach manuel-k werden die ja in die Benutzerumgebung geschrieben!?
Grüße
@echo off
set test=true
exit
echo %test%
Grüße
Hallo Peter161!
... aber: Wenn Du eine CMD-Shell öffnest (und die ist bei mir zB immer offen), darin einen Batch, der Variablenwerte ohne "
Ansonsten würde ich die Frage "
Grüße
bastla
Nach manuel-k werden die ja in die Benutzerumgebung geschrieben!?
Das dürfte manuel-k etwas überinterpretiert haben (sonst hätte es zB nie einer "setx.exe" bedurft) ...... aber: Wenn Du eine CMD-Shell öffnest (und die ist bei mir zB immer offen), darin einen Batch, der Variablenwerte ohne "
setlocal
" erzeugt / verändert, startest und danach einen anderen Batch oder einen Befehl unmittelbar von der Kommandozeile in der selben Shell ausführst, wirst Du die Werte des vorigen Batches noch wiederfinden ...Ansonsten würde ich die Frage "
setlocal
verwenden?" ganz salopp mit "Wenn's nix bringt, schadet's aber (zumeist) auch nicht" beantworten ... Grüße
bastla
ach hallo bastla,
setx.exe? hab ich noch nie was davon gehört !?
also wenn ich das so mache wie vorhins, dann kommt da nix, wie kann ich eine variable länger speichern? grüße
setx.exe? hab ich noch nie was davon gehört !?
also wenn ich das so mache wie vorhins, dann kommt da nix, wie kann ich eine variable länger speichern? grüße
Hallo Peter161!
Die "
... und mehr zum Thema zB hier ...
Grüße
bastla
Die "
setx.exe
" sollte es noch [ftp://ftp.microsoft.com/ResKit/win2000/setx.zip hier] geben ...... und mehr zum Thema zB hier ...
Grüße
bastla
anstatt setx.exe geht es vllt auch so
erstellt eine Umgebung mit den angegebenen Variablen aus der "Variablen.TXT" (muss im selben Verzeichniss liegen wie die "MitVariablenstarten.cmd" oder Pfadangabe) und eingegebenen Variablen und lässt das CMD-Fenster offen.
[OT]
schweift ja schon ein bissel weit aus
[/OT]
Gruß Phil
::---schnipp---MitVariablenstarten.cmd
if not .%1==.vars (cmd /k MitVariablenstarten.cmd vars
goto :eof)
set Variable1=Hier
set Variable2=Dort
::Fuer weitere Variablen einer Variablen.TXT
::Aufbau der Variablen.TXT je Zeile: VariablenName=VariablenWert
::oder: "VariablenName=VariablenWert"
(for /f "tokens=*" %%i in (Variablen.TXT) do set "%%~i")2>nul
cls
::---schnapp---MitVariablenstarten.cmd
erstellt eine Umgebung mit den angegebenen Variablen aus der "Variablen.TXT" (muss im selben Verzeichniss liegen wie die "MitVariablenstarten.cmd" oder Pfadangabe) und eingegebenen Variablen und lässt das CMD-Fenster offen.
[OT]
schweift ja schon ein bissel weit aus
[/OT]
Gruß Phil
Moin kkboy94,
moin manuel-r,Peter161, bastla und Pieh-ejdsch,
ich habe ein wenig den Eindruck, ein entscheidender Aspekt wird ein wenig zu wenig gewürdigt.
bastla hat ja unter dem Aspekt "Was aber, wenn eine Variable für spätere Sessions/Batches erhalten bleiben soll?" ausgeführt:
Genau andersherum betrachtet bedeutet aber ein "
Es kann also nicht passieren, dass ich eine "globale Variable" (oder zumindest eine global gemeinte) versehentlich überschreibe.
Kandidatennamen für das versehentliche Überschreiben sind natürlich die, deren Namen auch anderen Batch-Schrotern spontan und gerne einfallen wie path oder username.
Und so ziemlich jeder, der noch mitgelieferte Installations-/Setupskripte kennt aus den Zeiten in denen <i>"setlocal"<i> noch keine mögliche Option war, der hat damit Erfahrungen gemacht.
Da es nun einmal so ist, dass für ziemlich viele Fragestellungen und Skriptaufgaben beispielsweise Computername, Username und Pfad ermittelt und in Variablen zwischengespeichert und geändert werden...
--> die Wahrscheinlichkeit ist durchaus gegeben, dass sich ein anderer Skripter schon mal denselben Variablennamen ausgedacht hat.
Mit gesetztem "Setlocal" kloppe ich keine vorher gesetzten Variablen breit und kann immer sicher sein, dass ich keine unerwünschten Seiteneffekte auslöse.
Okay, "sicher" in dem Sinne, wie ihn Skripter verwenden... nicht absolut gemeint.
Grüße
Biber
moin manuel-r,Peter161, bastla und Pieh-ejdsch,
ich habe ein wenig den Eindruck, ein entscheidender Aspekt wird ein wenig zu wenig gewürdigt.
bastla hat ja unter dem Aspekt "Was aber, wenn eine Variable für spätere Sessions/Batches erhalten bleiben soll?" ausgeführt:
Zitat von @bastla:
... aber: Wenn Du eine CMD-Shell öffnest (und die ist bei mir zB immer offen), darin einen Batch, der Variablenwerte ohne
"
Kommandozeile in der selben Shell ausführst, wirst Du die Werte des vorigen Batches noch wiederfinden ...
Ansonsten würde ich die Frage "
schadet's aber (zumeist) auch nicht" beantworten ...
... aber: Wenn Du eine CMD-Shell öffnest (und die ist bei mir zB immer offen), darin einen Batch, der Variablenwerte ohne
"
setlocal
" erzeugt / verändert, startest und danach einen anderen Batch oder einen Befehl unmittelbar von derKommandozeile in der selben Shell ausführst, wirst Du die Werte des vorigen Batches noch wiederfinden ...
Ansonsten würde ich die Frage "
setlocal
verwenden?" ganz salopp mit "Wenn's nix bringt,schadet's aber (zumeist) auch nicht" beantworten ...
Genau andersherum betrachtet bedeutet aber ein "
setlocal
" in einem Batch entsprechend, dass alle Variablen, die im weiteren Batchverlauf definiert/gesetzt/geändert werden auch diesem Batch allein gehören.Es kann also nicht passieren, dass ich eine "globale Variable" (oder zumindest eine global gemeinte) versehentlich überschreibe.
Kandidatennamen für das versehentliche Überschreiben sind natürlich die, deren Namen auch anderen Batch-Schrotern spontan und gerne einfallen wie path oder username.
Und so ziemlich jeder, der noch mitgelieferte Installations-/Setupskripte kennt aus den Zeiten in denen <i>"setlocal"<i> noch keine mögliche Option war, der hat damit Erfahrungen gemacht.
Da es nun einmal so ist, dass für ziemlich viele Fragestellungen und Skriptaufgaben beispielsweise Computername, Username und Pfad ermittelt und in Variablen zwischengespeichert und geändert werden...
--> die Wahrscheinlichkeit ist durchaus gegeben, dass sich ein anderer Skripter schon mal denselben Variablennamen ausgedacht hat.
Mit gesetztem "Setlocal" kloppe ich keine vorher gesetzten Variablen breit und kann immer sicher sein, dass ich keine unerwünschten Seiteneffekte auslöse.
Okay, "sicher" in dem Sinne, wie ihn Skripter verwenden... nicht absolut gemeint.
Grüße
Biber