kkboy94
Goto Top

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
@echo off
angefangen.

Nun sehe ich aber in diesem Forum, dass viele Batch's mit
@echo off & setlocal
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:
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

Content-Key: 144744

Url: https://administrator.de/contentid/144744

Printed on: April 19, 2024 at 07:04 o'clock

Member: manuel-r
manuel-r Jun 13, 2010 at 17:13:58 (UTC)
Goto Top
Der erste Absatz in der Hilfe von setlocal sagt doch eigentlich alles:

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.
Member: kkboy94
kkboy94 Jun 13, 2010 at 17:39:31 (UTC)
Goto Top
Danke für die Antwort.

Das heißt also
setlocal löscht beim Beenden der Batch wieder alle Variablen, wenn ich meinen Test richtig gedeutet habe.

Man könnte das gleiche doch auch bewirken, indem man am Anfang und Ende jeder Batch die Variable wieder zurücksetzt
"set var="

Ich markiere das hier trotzdem mal als gelöst


MfG Karsten
Member: pieh-ejdsch
pieh-ejdsch Jun 13, 2010 at 17:43:27 (UTC)
Goto Top
Hi Karsten,

das ganze hatte ich mal hier Verwenden von Setlocal ... ein bisschen angerissen.

Gruß Phil
Mitglied: 42687
42687 Jun 13, 2010 at 20:01:53 (UTC)
Goto Top
hi, das macht mich jetzt auch ein bisschen stutzig, wenn ich einfach mal in ner batch schreibe:
@echo off
set test=true
exit
und dann ein neues CMD Fenster auf mache und die Vatiable test mit
echo %test%
abfrage, dann bekomme ich %test% zurück. Nach manuel-k werden die ja in die Benutzerumgebung geschrieben!?
Grüße
Member: bastla
bastla Jun 13, 2010 at 20:10:36 (UTC)
Goto Top
Hallo Peter161!
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 ... face-wink

Grüße
bastla
Mitglied: 42687
42687 Jun 13, 2010 at 20:14:21 (UTC)
Goto Top
ach hallo bastla,
setx.exe? hab ich noch nie was davon gehört !? face-smile
also wenn ich das so mache wie vorhins, dann kommt da nix, wie kann ich eine variable länger speichern? grüße
Member: bastla
bastla Jun 13, 2010, updated at Oct 18, 2012 at 16:42:31 (UTC)
Goto Top
Hallo Peter161!

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
Member: pieh-ejdsch
pieh-ejdsch Jun 13, 2010 at 21:28:53 (UTC)
Goto Top
anstatt setx.exe geht es vllt auch so


::---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
Member: Biber
Biber Jun 14, 2010 at 07:13:01 (UTC)
Goto Top
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:
Zitat von @bastla:
... 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 ... face-wink

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
Member: kkboy94
kkboy94 Jun 15, 2010 at 15:28:05 (UTC)
Goto Top
Sorry, das kommt etwas spät, ich weiß. Aber
DANESCHÖN für dei Hilfe

MfG Karsten