Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Eine Batch-Datei RICHTIG anfangen (setlocal oder nicht?)

Frage Entwicklung Batch & Shell

Mitglied: kkboy94

kkboy94 (Level 1) - Jetzt verbinden

13.06.2010, aktualisiert 18.10.2012, 27868 Aufrufe, 10 Kommentare

Ich habe jetzt schon des öfteren verschiedene Batch-Dateien geschrieben, geändert,....
Diese Dateien haben immer mit
01.
@echo off
angefangen.

Nun sehe ich aber in diesem Forum, dass viele Batch's mit
01.
@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

Mit freundlichen Grüßen Karsten
Mitglied: manuel-r
13.06.2010 um 19:13 Uhr
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.
Bitte warten ..
Mitglied: kkboy94
13.06.2010 um 19:39 Uhr
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


Mit freundlichen Grüßen Karsten
Bitte warten ..
Mitglied: pieh-ejdsch
13.06.2010 um 19:43 Uhr
Hi Karsten,

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

Gruß Phil
Bitte warten ..
Mitglied: Peter161
13.06.2010 um 22:01 Uhr
hi, das macht mich jetzt auch ein bisschen stutzig, wenn ich einfach mal in ner batch schreibe:
01.
@echo off 
02.
set test=true 
03.
exit
und dann ein neues CMD Fenster auf mache und die Vatiable test mit
01.
echo %test%
abfrage, dann bekomme ich %test% zurück. Nach manuel-k werden die ja in die Benutzerumgebung geschrieben!?
Grüße
Bitte warten ..
Mitglied: bastla
13.06.2010 um 22:10 Uhr
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 ...

Grüße
bastla
Bitte warten ..
Mitglied: Peter161
13.06.2010 um 22:14 Uhr
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
Bitte warten ..
Mitglied: bastla
13.06.2010, aktualisiert 18.10.2012
Hallo Peter161!

Die "setx.exe" sollte es noch hier geben ...
... und mehr zum Thema zB hier ...

Grüße
bastla
Bitte warten ..
Mitglied: pieh-ejdsch
13.06.2010 um 23:28 Uhr
anstatt setx.exe geht es vllt auch so


01.
::---schnipp---MitVariablenstarten.cmd 
02.
if not .%1==.vars (cmd /k MitVariablenstarten.cmd vars 
03.
goto :eof) 
04.
set Variable1=Hier 
05.
set Variable2=Dort 
06.
::Fuer weitere Variablen einer Variablen.TXT 
07.
::Aufbau der Variablen.TXT je Zeile:    VariablenName=VariablenWert 
08.
::oder:  "VariablenName=VariablenWert" 
09.
(for /f "tokens=*" %%i in (Variablen.TXT) do set "%%~i")2>nul 
10.
cls 
11.
::---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
Bitte warten ..
Mitglied: Biber
14.06.2010 um 09:13 Uhr
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 ...

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
Bitte warten ..
Mitglied: kkboy94
15.06.2010 um 17:28 Uhr
Sorry, das kommt etwas spät, ich weiß. Aber
DANESCHÖN für dei Hilfe

Mit freundlichen Grüßen Karsten
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...