pieh-ejdsch
Goto Top

Wie Arbeite ich mit Batch UmgebungsVariablen? Erstellung Umgang Erweiterungen Veränderungen

eine Variable ist schön und gut aber wie kann ich die denn selbst erstellen und was kann ich denn alles damit anstellen?...
Hier gibt es ein paar Antworten darauf
Schau ruhig hierhinein, wenn Du Probleme im Batch hast oder Infos brauchst.

Um nicht lange nach Irgendetwas zu suchen: wenn Du Stichpunkte siehst
*
bekommst Du Grundlegende Schnellinformationen, zu beachtendes oder Tips - zum jeweiligen Thema.

back-to-topWie Arbeite ich mit Batch UmgebungsVariablen? Erstellung Umgang Erweiterungen Veränderungen Ersetzung

[[toc]]
solltest Du den Link zur Übersicht aus der FAQ - Formatierungen in den Beiträgen benutzt haben klicke bitte hier für den Rückweg
Updated at last: 27.08.2009 03:08

back-to-topVariablen werden im Batch oder CMD zur zur Weitergabe an Befehle genutzt

mit der Verwendung von Variablen im Batch ist es möglich an andere Befehle
  • Befehle,
  • Befehlsoptionen,
  • Zeichenfolgen,
zu übergeben und
  • Variablen zu Erweitern oder zu verändern

es gibt Unterschiedliche Arten von Variablen
  • Umgebungsvariablen sind nur innerhalb der Batch oder CMD aktiv
  • - Statische Umgebungsvariablen sind solange festgelgt bis sie durch den Befehl SET verändert werden
  • - Dynamische Umgebungsvariablen sind von der Laufzeit und Umgebung abhängig und werden nicht durch den Befehl SET Aufgelistet
  • FOR-Variablen sind nur innerhalb einer FOR Schleife aktiv
  • Batchparameter-Erweiterungsvariablen werden in einer Batch vom Aufrufer Übernommen
  • Systemvariablen sind im Betriebssystem fest definierte Variablen

um mit UmgebungsVariablen im Batch zu Arbeiten, musst Du erst mal eine Variable erstellten.
Inhaltsverzeichnis

back-to-top(Normale) Variablen werden mit dem Befehl SET erstellt
set Variablenname=Wert für die Variable
alles was vor dem = steht wird als Variablenname festgelegt auch Leerzeichen, ausser allen Leerzeichen nach SET.
alles was hinter dem = steht wird als Wert für die Variable festgelegt auch Leerzeichen hinter dem Wert ausser < > | & diese müssen (genau wie in der (Gruppe) der FOR Schleife für die Befehlsverkettung; oder zB. Zeichenfolgen für ECHO) mit vorangestelltem Escapezeichen ^ eingetragen werden oder Du benutzt " ". Diese < > | & werden sonst als Befehlverkettung bzw -Umleitung interpretiert.
  • Achtung das Escapezeichen ^ ist ein Sonderfall und muss je nach späterer Verwendung der Variable
    • innerhalb von AnführungsZeichen normal genutz werden aber
    • Nicht innerhalb von AnführungsZeichen Verdoppelt werden
um zu verhindern, dass (mehrere) Leerzeichen (wie auch immer die da hingekommen sind?) nach dem Wert der Variablen mit in die Variable aufgenommen werden oder auch < > | & ^ aufzunehmen setzt Du " ". Die " werden nicht in die Variable aufgenommen.
set "Variablenname=Wert für die Variable"
um einen Wert für die Variable in mit " " festzulegen um zB. Leerzeichen oder < > | & ^ miteinzubeziehen setzt Du " vor und hinter den Wert für die Variable
set Variablenname="Wert für die Variable"

  • Befehlsverkettung wird nach dem SET Befehl (Normale Variable) ein weiter Befehl angefügt werden alle Leerzeichen zwischen Wert für die Variable und Befehlsverkettungszeichen (& &&) mit in die Variable aufgenommen. Um das zu verhindern setzt Du entweder die Befehlsverkettung ohne Leerzeichen direkt hinter Wert für die Variable oder Du Benutzt Umgebende Gänsefüschen ".
set Variablenname=Wert für die Variable& ECHO Variablenerstellung ist fertig
set "Variablenname=Wert für die Variable" & ECHO Variablenerstellung ist fertig

  • das = wird im Variablenname nicht akzeptiert
  • die Verwendung des % und ! im Variablennamen wird nicht Empfohlen wenn Variablen Erweitert oder Verändert werden
  • Achtung! das % ( Prozentzeichen ) wird im Batch NUR mit einem extra vorangestelltem % Prozentzeichen in den Variablenname bzw in den Wert für die Variable aufgenommen.
  • bei Unklarheiten, ob spezielle Sonderzeichen oder Leerzeichen im Wert für die Variable enthalten sind solltest Du immer die Umgebenden Gänsefüschen "Drumherumbasteln".
  • mit Numerischen Variablen wird gezählt, nummeriert und gerechnet.
Inhaltsverzeichnis

back-to-topNumerische Variablen werden mit SET /A erstellt
set /a Variablenname=Zahl

um negative Zahlen als Variable anzugeben ein - (minus) hinter das = setzen
set /a Variablenname= -Zahl

  • bei erstellen von Numerischen Variablen brauchst Du nicht auf Leerzeichen zu achten.
es macht Deine Batch viel Übersichtlicher wenn Du jeweils Leerzeichen dazwischensetzt. sollte der Variablenname Leerzeichen enthalten bekommst Du eine Fehlermeldung. " " setzten brauchst Du deswegen auch nicht es wird sowieso kein Variablenname mit Leerzeichen Akzeptiert. Du kannst auch gleich mehrere Numerische Variablen erstellen, dazu nimmst Du das Komma für das Festlegen eines nächsten Variablenname2.
set /a Variablenname = + 5 , Variablenname2 = 5 - 14 , Zahl = 346

es werden alphabetische Werte zur Berechnung als Operand genommen wenn diese als Variablenname2 festgelegt sind. Wenn Du Variablenname2 vorher nicht erstellt hast wird die Zahl 0 eingesetzt. der Variablenname2 darf natürlich auch keine Leerzeichen enthalten.
set /a Variblenname = + Variablenname2

wenn ein Operator + - * / % ( Addition Subtraktion Multiplikation Division Modulo ) zwischen Variablenname und dem = steht wird diese Variable mit als Operand genommen und neu erstellt - ansonsten wird diese Variable nur erstellt.
  • Achtung! Der Operator Modulo % ( Prozentzeichen ) wird im Batch NUR mit einem extra vorangestelltem % ( Prozentzeichen ) als Operator erkannt.

wenn ein oder mehrere Operatoren nach dem = stehen werden diese mit als Operand(en) genommen.
den zu erstellenden Variablenname kannst Du auch als Operand nehmen.
Beachte: Punktrechnung geht vor Strichrechnung und Division durch 0 geht nicht, Klammerrechnung geht vor alles
set /a Variablenname + = Zahl * Zahl2 - Variablenname2
set /a Variablenname = ( 5 + Zahl ) * Variablenname

  • Leider kann die CMD nichts mit Gebrochenen Dezimalzahlen (sondern nur Ganze Zahlen) anfangen - auch nicht beim Ergebnis. Bei Division wird nicht gerundet nur der Wert ohne Rest wird ausgegeben. Dafür kannst Du aber Hexadezimale Zahlen als Variablenwerte erstellen. (wozu das blos sein soll) Mit vorangestelltem 0x hinter dem = kannst Du 0-9 und a-f ohne Leerzeichen eingeben. Somit wird bei der Eingabe von 0xff als Zahl 255 und bei 0x10 als Zahl 16 gesetzt.
set /a Variablenname = 0xff

  • Sobald eine Numerische Variable als 1. Stelle eine NULL 0 enthält dürfen die nachfolgenden Stellen auch keine ACHT 8 und NEUN 9 enthalten, sonst erhälst Du eine Fehlermeldung. Eine solche Variable wird als Oktale Zahl angesehen und im Dezimalsystem dargestellt und erstellt. Um daraus eine Ganze Zahl zu erstellen muss die Variable ohne die Vornull(en) erstellt werden. (siehe dazu Erweitern)
set /a Variablenname = 07

  • Die CMD kann auch nichts mit Zahlen größer 2.147.483.647 anfangen. Darübergehende Zahlen also von 2.147.483.648 bis zur Zahl 4.294.967.294 werden in die Numerische Variable als Negative Zahl von -2.147.483.648 bis -2 festgelegt. Ab der Zahl 4.294.967.294 gibt Dir die CMD eine Fehlermeldung aus. Für die Nagativen Zahlen gilt der Satz entsprechend mit Umgekehrter Bedeutung.

Inhaltsverzeichnis

back-to-topWert der Variablen wärend des Ablaufes Deiner Batch eingeben werden mit SET /P erstellt
um Variablenwerte wärend des Ablaufes der Batch einzugeben welche als Eingabe zB. Dateinamen für den weiteren Batchablauf erwarten nimmst Du diese Variante der Variablenerstellung.
Dafür lässt Du einfach hinter dem = alles frei oder schreibst Dir eine Zusatzbemerkung dahinter, damit Du weisst warum Du die Eingabe machen sollst zB. Gib den Namen für die neue Textdatei ein (und noch ein oder zwei Leerzeichen damit du deine Eingabe besser von Deiner Zusatzbemerkung unterscheiden kannst.)
Wenn Du für Deine Eingabe eine neue Leere Zeile im CMD Fenster haben willst dann machst Du hinter Deine Bemerkung soviele Leerzeichen bis Du zwischen dem = und dem letzten Leerzeichen 81 (oder mehr) Zeichen hast. 80 Zeichen breit ist das Standard CMD Fenster.
set /p Variablenname=Gib den Namen für die neue Textdatei ein
Die Batch hält an dieser Stelle an und wartet auf die Eingabe des Wert(es) der Variable. Beachte aber wenn die Batch abläuft das jedes Zeichen in diese Variable aufgenommen wird auch Leerzeichen am Ende. Doch Du kannst bevor Du Enter drückst mit der Rücktaste Deine Eingabe korrigieren.
  • die " " um Variablenname=Gib den Namen für die neue Textdatei ein kannst Du dir beim schreiben der Batch ersparen. SET /P behandelt diesen Befehl wie als wären die umgebenden " " vorhanden.
Inhaltsverzeichnis

back-to-topUmgang mit Umgebungsvariablen

nun möchtest Du das ein Befehl Deine NeueVariable mit dem Wert von NeueVariable in den Befehl miteinbezieht.
damit ein Befehl NeueVariable als NeueVariable erkennt setzt Du % vor und hinter NeueVariable
mit dem % Zeichen um NeueVariable wird an dieser Stelle im CMD oder Batch der Wert von NeueVariable eingesetzt.
echo %NeueVariable%
wenn Du NeueVariable aber vorher nicht erstellt hast wird Dir nur beim Befehl ECHO nur
%NeueVariable%
im CMD-Line angezeigt.
  • alle Befehle im Batch ausser in der CMD-Line zB. ECHO behandeln die nicht (vorher) erstellte NeueVarible als Nichtvorhandenes Zeichen und dieses wird nicht mit in den Befehl aufgenommen.
  • Wenn Du NeueVariable vorher erstellt hast dann wird der Wert von NeueVariable im Befehl einbezogen.
nun macht es sich auch bemerkbar ob Du die Befehlsverkettungszeichen < > | & im Wert von NeueVariable mit eingesetzt hast.
ein < gibt den Befehl eine Eingabe (das was hinter dem < steht) meist aus Dateien
ein > gibt die Ausgabe des Befehls (ECHO) in eine Datei (welche hinter dem > steht)
ein & wird alles was hinter dem & steht als eine neuen Befehl behandeln
ein | wird alles was hinter dem | steht als eine neuen Befehl behandeln und übergibt die Ausgabe des Befehls (ECHO) an den neuen Befehl als Eingabe
^ werden nur bei Variablenerstellung mit " " angegezeigt
  • Bei einigen Befehlen zB. IF ist es erforderlich NeueVariable in " " zu setzen zB. wenn der Wert für die Variable Leerzeichen enthält wie in Dateinamen oder Pfadangaben.
  • Wenn der Wert für die Variable < > | & enthält und Du keine Befehlsverkettung möchtest bastelst Du ebenfalls "Gänsefüschen" drumherum.
Numerische Variablen brauchst Du nicht in " " zu setzten.
if "%NeueVariable%" == "Wert x y" echo Ja

  • Wenn Du beim erstellen von NeueVariable den Wert für die Variable mit " " umgeben hast muss die vorherige Zeile so aussehen
if %NeueVariable% == "Wert x y" echo Ja
Inhaltsverzeichnis

back-to-topExistens von Variablen prüfen mit SET

der Befehl SET ohne nachträgliche Eingaben zeigt alle derzeit gesetzten Umgebungsvariablen und Systemvariablen an
dabei zeigt Dir die Zeichenfolge vor dem = den Variablenname und die Zeichenfolge nach dem = den Wert für die Variable an
set
möchtest Du nur wissen ob eine NeueVariable vorhanden ist dann setzt Du hinter SET NeueVariable
set NeueVariable
nun werden Dir alle Variablen die mit NeueVariable beginnen angezeigt.
das ist zum Beispiel Hilfreich wenn Du mehrere NeueVariable(n)...x,y,z erstellt hast und diese NeueVariable(n) im späteren Batch Nacheinander Verwenden möchtest.
set NeueVar

  • Tipp wenn Du nur Deine Variablen, welche Du im CMD oder Batch erstellen möchtest und . oder : anstelle des Leerzeichens zwischen SET und Variablenname einsetzt. Das funkioniert aber nicht mit SET /A; SET /P; und komplett umschliessenden " " nach SET. Stattdessen setzt Du bei Diesen Befehlen vor dem Variablenname den . oder : und lässt das Leerzeichen dafür weg.
set.Variablenname=Wert für die Variable
set /a.Variablenname=Wert für die Variable
set ".Variablenname=Wert für die Variable"

  • - kannst Du Nun alle Deine Variablen mit SET. oder SET: Anzeigen ohne die Systemvariablen Anzuzeigen.
set.
Du kannst aber auch den Punkt sowie andere Zeichen oder Zeichenfolgen zur Unterscheidung von den Systemvariablen am Anfang des Variablenname setzten, die Variable Normal mit Leerzeichen nach SET erstellen. Mit SET gefolgt von dem/n Zeichen(/-folgen) zur Unterscheidung zeigst Du Dir dann alle Variablen mit Deinem Vorsatz an.
set ??Variablenname=Wert für die Variable
set ??
um zu überprüfen ob eine Bestimmte NeueVariable existiert nimmst Du den Befehl IF DEFINED
dahinter schreibst Du Deinen Befehl der Ausgeführt werden soll wenn NeueVariable existiert
if defined NeueVariable echo NeueVariable existiert.
oder etwas länger mit "" in dem Vergleich vom Befehl IF NOT
if not "%NeueVariable%" == "" echo NeueVariable existiert

  • Wenn der Wert für die Variable KEINE Leerzeichen enthält reicht es ein Zeichen davor oder dahinter zu setzen
if not .%NeueVariable% == . echo NeueVariable existiert
Inhaltsverzeichnis

back-to-topErweitern von UmgebungsVariablen

der Windows Hilfe und Support gibt nicht viel Preis über den Erweiterten Umgang mit UmgebungsVariablen. Nur der Befehl FOR und die PARAMETER sprechen von Erweitern von FORVariablen bzw ErweiterungsVariablen. Beim Aufruf der Hilfe von SET bekommtst Du schon mehr Infos. Diese Variablen werden aber nicht neu erstellt sondern diese werden nur anders Angezeigt. Die Variable so wie diese Ursprünglich erstellt worden ist wird gar nicht Verändert. was auch für die UmgebungsVariablen gilt.
Inhaltsverzeichnis

back-to-topErweitern von UmgebungsVariablen mit Wegschnitt
dabei setzt Du % direkt vor Variablenname direkt hinter ein :~ danach den Wegschnitt als Zahl-x (direkt dahinter, Zahl-y) und direkt dahinter wieder % ein.
%Variablenname:~ Wegschnitt%

natürlich wird von der Variable nichts weggeschnitten sondern nur die Anzeige verändert mit Wegschnitt erklärt sichs halt besser. die Leerzeichen vor Zahl x (und Zahl y) kannst Du weglassen, es trägt aber einer besseren Übersicht bei.
es ist egal ob es sich dabei um eine Numerische oder normale Umgebungsvariable handelt.
es werden nur Teile der erstellten Variable angezeigt, dabei legt die Zahl fest bis zu welcher Stelle im Wert der Variable gezählt wird
Wegschnitt Bedeutung vor dem Komma (wie ohne Komma und 2. Zeichen)
, Bedeutung nach dem Komma
<-ist die Zählung-----|
..wird nicht gezählt..
x, y schneidet VORNE weg - NACH dem x ten zeichen
, zeigt y Zeichen schneidet DANACH weg
<-Abfall---x|...das.bleibt.stehen...
<--das-bleibt-stehen--y|.....Abfall.
-x, -y schneidet VOR dem x ten zeichen von HINTEN
, schneidet NACH dem y ten zeichen von HINTEN
.Abfall...|x----das-bleibt-stehen-->
...das.bleibt.stehen..y|---Abfall-->
  • bei zwei negativen Zahlen muss die erste Zahl größer sein
  • wenn die Variable weniger Zeichen hat als die erste positive oder die zweite negative Zahl wird die Variable nicht Angezeigt
Beispiele:
set a=BeispielVariable
echo %a:~ 7, 3%

%a:~ 7, 3%
Anzeige: lVa
Zeigt die Variable a schneidet von vorne 7 Zeichen weg und schneidet nach 3 Zeichen weg
%a:~ -5, 2%
Anzeige: ia
Zeigt die Variable a schneidet vor dem 5. Zeichen von Hinten weg und schneidet nach 2 Zeichen weg
%a:~ 4, -7%
Anzeige: pielV
Zeigt die Variable a schneidet von vorne 4 Zeichen weg und schneidet nach dem 7. Zeichen von Hinten ab
%a:~ 9%
Anzeige: ariable
zeigt die Variable a schneidet von vorne 9 Zeichen weg
  • wenn Du x (y) vorher als Variablen festgelegt und im Batch vorher die verzögerte Umgebungsvariablenerweiterung (was fürn Wort) mit dem Befehl setlocal enabledelayedexpansion aktiviert hast, setzt Du bei der zu Erweiternden Variable anstelle der % ein !. Um die Variablen x y setzt Du dann %.
echo !Variablenname:~ %x%, %y%!
Inhaltsverzeichnis

back-to-topErweitern von UmgebungsVariablen mit Ersetzen
beim Ersetzen von Zeichen oder Zeichenabfolgen werden die Variablen nur anders angezeigt und nicht verändert
dazu setzt Du % direkt vor Variablenname direkt dahinter : das Zeichen oder die zu ersetztende Zeichenfolge gefolgt von = und das Zeichen oder die Zeichenfolge welche stattdessen angezeigt werden soll; und schliest das ganze mit % ab.
%Variable:zu ersetzender Teil=wird Ersetzt mit%
wenn das erste Zeichen in zu erstzender Teil ein * (Stern) ist und das Zeichen bzw die zu ersetzende Zeichenfolge in dem Wert für die Variable zum ersetzen gefunden wird, wird von Beginn des Wert für die Variable bis zum ersten übereinstimmen dieser Zeichenfoge in dem Wert für die Variable mit den Angebenen Zeichen Ersetzt.

Beispiele:
%a:e=x%
Anzeige: BxisxelVariablx
Zeigt die Variable a ersetzt alle e mit x
%a:*l=%
Anzeige: Variable
Zeigt die Variable a ersetzt alles von Beginn an bis einschliesslich dem ersten l mit nichts
Inhaltsverzeichnis

back-to-topUmgebungsVariablen Löschen und Wiederherstellen. Wofür ist SETLOCAL und ENDLOCAL


back-to-topLöschen von UmgebungsVariablen
gesetzte Variablen belegen Speicher und begrenzen auch die Aufnahmekapazität weiterer Variablen
andere Variablen wiederum löschst Du, wenn Du diese nicht mehr benötigst. Dazu setzt Du hinter den Befehl SET den Variablenname direkt dahinter istgleich. Damit legst Du für den Variablenname Nichts fest und sie ist gelöscht. Wenn aber hinter dem istgleich noch ein Leerzeichen ist wird die Variable nur neu gesetzt.

set Variablenname=
Um eine ganze Reihe Deiner selbsterstellten Variablen zu löschen kannst Du Dir mithilfe einer FOR-Schleife alle mit Vorangestelltem gleichen Zeichen bzw Zeichenfolgen zB. ?? in einem Rutsch löschen.
for /f "delims==" %i in ('set ??') do set "%i="


  • wenn Du öfter auf der Befehlszeile (CMD-Line) rumhantierst und Debugging machts - nervt es ständig die CMD-Line zu schließen, weil die gesetzten Variablen beim Nächsten Aufruf des zu Prüfenden (Batch)Programmes diese selbst beeinflussen würden. Andererseits wird beim Neuaufruf der CMD-Line über "Ausführen" ebenfalls der Befehlsspeicher (Auswahl mit Pfeil Hoch und Runter oder F5, F7, F8) gelöscht wenn Du nur auf der CMD-Line die Befehle eingegeben hast. Da SETLOCAL und ENDLOCAL auf der CMD-Line nicht funtionieren ist hier ein OneLiner für die Befehlszeile welcher ohne die Systemvariablen zu beeinflussen die Namen der zum Zeitpunkt der jeweils ersten Ausführung von diesem OneLiner gesetzten Umgebungsvariablen in eine Variable speichert (Snapshot) und bei der jeweils Zweiten Ausführung alle nach dem Snapshot gesetzten Variablen löscht.

if defined __Recall_ ((for /f "delims==" %i in ('set') do @echo "%__Recall_%" |find "  %i  ">nul|| set "%i=")&& set "__Recall_="& echo Snapschuss zurueckgesetzt!) else (set "__Recall_=  "&&for /f "delims==" %i in ('set') do @call set "__Recall_=%__Recall_%%i  ")&& echo Snapshot erstellt!  
Inhaltsverzeichnis

back-to-topVerwenden von SETLOCAL und ENDLOCAL ( Begrenzung und Veränderung der LaufzeitUmgebung )
zu jeder Laufzeit einer Umgebung wird durch Vordefinierte Variablen festgelegt wie welche Programme gesteuert werden und worauf diese zugreifen. Im Betriebssystem sind dies die SystemVariablen, welche zB. Pfade für Ausführbare Programme bereitstellen, Extensions für Ausführbare Dateien angeben oder Informationen zum Betriebsystem und Prozessor für InstallationsProgramme zur Verfügung stellen. Systemvariablen sind global gültig und jedes Programm welches eine Umgebung bereitstellt kann die global gültigen Systemvariablen nutzen. in diesem Fall sind die Systemvariablen also auch Globale Variablen.
eine Lokalisierung von UmgebungsVariablen bestimmt daher eine Begrenzung von Umgebungsvariablen auf den Zeitpunkt des Startes der Lokalisierung in der jeweiligen Umgebung. daher spricht man auch von lokalen Variablen, welche NUR innerhalb dieser Grenze von der Umgebung also Local Aktiv sind.

alle SystemVariablen werden bei jedem Start der CMD-Line oder einer Batch über den Dialog "Ausführen" bzw den "Explorer" als UmgebungsVariablen festgelegt.

Wenn Du in der CMD-Line die CMD.EXE oder ein Batchprogramm aufrufst, werden von der CMD-Line alle derzeit gesetzten UmgebungsVariablen als Snapshot gespeichert und in der neuen CMD ( neue LaufzeitUmgebung ) als UmgebungsVariablen zur Verfügung gestellt. wenn Du die zweitaufgerufene CMD.exe nun mit EXIT verlässt werden alle UmgebungsVariablen so (zurück)gesetzt wie diese zum Zeitpunkt des Snapshot waren. Jede Aufgerufene CMD.exe stellt eine Lokale Umgebung zur verfügung Sozusagen wird beim exit einer untergeordneten CMD.exe auch eine gelöschte Variable Wiederhergestellt wenn diese in der Übergeordneten CMD.exe erstellt wurde.

Es ist also ziemlich unsinnig eine Subroutine oder auch SubBatch aufzurufen, welches ein Setlocal hat, vor dem Endlocal Variablen erstellt und diese Variablen dann beim Beenden in die Übergeordnete Routine zurückgeben soll. Wenn die Variablen aus einer Subroutine trotz SETLOCAL an die Übergeordnete Routine übergeben werden sollen müssen die zu Übergebenden Variablen in der gleichen Befehlszeile und hinter ENDLOCAL (nocheinmal in sich selbst) Erstellt werden. Am besten mit Gänsefüsschen - wenn man nicht weiss, ob Befehlsverkettungszeichen enthalten sind.
ENDLOCAL & set "VariableZumUebergeben=%VariableZumUebergeben%"

Diese Lokalisierung (Snapshotfunktion) übernehmen die Befehle SETLOCAL und ENDLOCAL im Batch.
für die Veranschaulichung sind hier zwei Batchdateien ( PruefeA.cmd und PruefeB.cmd ), welche Variablen Erstellen dann die jeweils andere Batch aufruft welche Variablen Löscht und Erstellt. Dabei läuft eine Batch Ohne SETLOCAL und die andere Teilweise Mit SETLOCAL, um die Unterschiede vom gesetzten oder nichtgesetzten SETLOCAL sichtbar zu machen. Nebenbei wird auch die Variable A im ENDLOCAL mit Übergeben.
:: ---schnipp---- PruefeA.cmd
@echo off
set callaoff=1
echo ------------------------------------------------------------------------------
echo Hier ist PruefeA, ich laufe Ohne Setlocal!
echo Variablen A: %a% , AN: %an% , AS: %as% , B: %b% , BN: %bn% , BS: %bs%& echo.
echo Erstelle "B" "BN" "BS" und Loesche "AN" "AS"  
set b=12%3& set bn=ww%%w%%& set bs=zz%%%z%%%& set an=& set as=
echo Variablen A: %a% , AN: %an% , AS: %as% , B: %b% , BN: %bn% , BS: %bs%& echo.
if not defined callbOff echo Ich rufe PruefeB Mit-Parametern: Eins Zwei Drei !& call pruefeB Eins Zwei Drei& echo PruefeB Loeschte: "BN" "BS" , Erstellte: "A" "AN" "AS" !  
if not defined callboff echo Variablen A: %a% , AN: %an% , AS: %as% , B: %b% , BN: %bn% , BS: %bs%
echo Ende PruefeA
set callaoff=
if not defined callboff pause
echo ------------------------------------------------------------------------------
:: ---schnapp---- PruefeA.cmd

:: ---schnipp---- PruefeB.cmd
@echo off
echo ------------------------------------------------------------------------------
echo Hier ist PruefeB: ich laufe noch OHNE SETLOCAL! Aber spaeter mit Setlocal!
echo Variablen A: %a% , AN: %an% , AS: %as% , B: %b% , BN: %bn% , BS: %bs% Parameter: %1 %2 %3& echo.
echo ich Erstelle "AN" "Z" "W" Loesche "BN"  
set an=xx%%2& set bn=& set z=Anders& set w=wieder
echo Variablen A: %a% , AN: %an% , AS: %as% , B: %b% , BN: %bn% , BS: %bs%& echo.
setlocal
echo Achtung ab jetzt laufe ich MIT SETLOCAL weiter! 
set callboff=1
echo danach Erstelle ich "A" "AS" und Loesche "BS"   
set a=98%1& set as=yy%%%31& set bs=
echo Variablen A: %a% , AN: %an% , AS: %as% , B: %b% , BN: %bn% , BS: %bs%& echo.
if not defined callaOff echo Ich rufe PruefeA!& call pruefeA& echo PruefeA Loeschte: "AN" "AS"; Erstellte: "B" "BN" "BS"; Gab: "A" ueber ENLOCAL!  
if not defined callaoff echo Variablen A: %a% , AN: %an% , AS: %as% , B: %b% , BN: %bn% , BS: %bs%
echo Ende PruefeB
set callboff=
if not defined callaoff pause
endlocal & set a=%a%
echo ------------------------------------------------------------------------------
:: ---schnapp---- PruefeB.cmd

die beiden Befehle SETLOCAL und ENDLOCAL funktionieren nur im Batch und NUR paarweise, das heist ENDLOCAL ist vom SETLOCAL abhängig und ENDLOCAL wird (Auch Automatisch beim Abbruch oder Erreichen vom Ende der Batch!) NUR Ausgeführt wenn vor dem ENDLOCAL ein SETLOCAL erfolgt ist. SETLOCAL und ENDLOCAL können auch verschachtelt werden, das heisst wenn zB dreimal SETLOCAL erfolgt ist wird das erste ENDLOCAL das dritte SETLOCAL zurücksetzen.
mit SETLOCAL wird eine Kopie aller derzeit gesetzten Umgebungsvariablen als Snapshot gespeichert und beim Abbruch oder Erreichen vom Ende der Batch oder mit ENDLOCAL zum Zeitpunkt des Snapshot (zurück)gesetzt.
  • SETLOCAL kann bis 32 Ebenen (LaufzeitUmgebungen) verschachtelt werden
  • zur LaufzeitUmgebung zählen auch aktuelle Pfade!
  • Achtung ein ENDLOCAL wird auch eine zugehörige SETLOCAL EnableDelayedExpansion deaktivieren.
  • für das Debugging von Batchdateien in einer CMD-Line kann eine Nichtverwendung des SETLOCAL bei unerwarteten Batchabbruch eine Möglichkeit sein die gesetzten Variablen der Batch abzufragen. Dafür gibt der Onliner NACH jeder weiteren ausser der ersten Ausführung die Variablen Preis, welche zur ersten Ausführung noch nicht gesetzt waren.

if defined __Recall_ (for /f "tokens=1* delims==" %i in ('set') do @echo "%__Recall_%" |find "  %i  ">nul|| echo %i=%j) else (set "__Recall_=  "&&for /f "delims==" %i in ('set') do @call set "__Recall_=%__Recall_%%i  ")&& echo Snapshot erstellt!  
Inhaltsverzeichnis

back-to-topBesonderheiten mit Variablen einfache oder doppelte Prozentzeichen

Warum werden einfache Prozentzeichen % in der CMD-Line in den Namen bzw Wert für die Variable aufgenommen aber nicht im Batch?
zunächst einmal solltest Du wissen warum in der CMD-Line nur ein Prozentzeichen ausreichend ist.
Eine gesetzte UmgebungsVariable wird mit einem vorangestellten und einem nachgestellten % Prozentzeichen dazu gebracht Ihren Wert auszugeben.
das einzelne Prozentzeichen mit angehefteten NichtNumerischenZeichen(folgen) in einer FOR-Schleife stellt eine FOR-Variable dar, welche NUR innerhalb dieser FOR-Schleife aktiv ist und angesprochen werden kann. ein einzelnes Prozentzeichen in einer Numerischen SET Anweisung stellt den Operator Modulo dar, welcher nur einen Rest von einer Division ausgibt.
im Batch gibt es die Batchparameter oder auch Batchparameter-Erweiterungsvariablen diese werden mit einem Vorangestellten % Prozentzeichen und einer einstelligen Ziffer dargestellt. Was sagt denn noch der Windows Hilfe & Support so? "... um den Batchparameter zu ... erweitern. Geben Sie das Prozentzeichen (%) gefolgt von einer Tilde (~) ein, und geben Sie dann den entsprechenden Parameter ein (d. h. %~Parameter), um einen Parameter zu verwenden ....Die Syntax %~ muss durch einen gültigen Argumentwert abgeschlossen sein." dieser Argumentwert ist demnach die Ziffer für den Enstsprechend Aufzurufenden Parameter.
- achso jetzt sehen also die Batchparameter mit ihren Prozentzeichen und zB. Ziffer 2 %2 genauso aus wie um bei der Numerischen SET Anweisung von einem Divident den Modulo 2 auszurechnen. deswegen geht die CMD also immer bei einem Prozentzeichen gefolgt von einer Ziffer von einem Batchparameter aus. damit man dann die FOR-Variablen von den Batchparameter-Variablen unterscheiden kann bekommen die FOR-Variablen ein weiteres Prozentzeichen aufgedrückt. und Modulo für SET /A bekommt auch ein extra Prozentzeichen. Somit muss also jedes darzustellende Prozentzeichen welches NICHT für eine UmgebungsVariablendarstellung oder BatchParameterdarstellung steht im Batch mit einem zusätzlich Vorangestellten Prozentzeichen ergänzt werden.
Eine Aussnahme bilden Befehle wobei die Prozentzeichen in der Ausgabe enthalten sind und mittels Befehlsverkettung Umgeleitet werden.
Eine Weitere Aussname gilt auch für die ForVariablen welche die enthaltenen Prozentzeichen hinter dem DO jedem Befehl richtig Übergeben zB. wird beim Set Befehl hinter dem DO in eine Umgebungsvariable der Wert mit Prozentzeichen aufgenommen.
Ein mit CALL Übergebener Batchparameter wird zwar das Prozentzeichen richtig aufnehmen aber in der Subroutine wird das Doppelte Prozentzeichen als eines Dargestellt, wenn dieses Einzelne Prozentzeichen NICHT für eine UmgebungsVariablendarstellung bzw Batchparameter steht wird es Ignoriert und nicht Dargestellt.
Inhaltsverzeichnis

back-to-topSticky: in manchen Batches sehe ich ähnliche Zeilen wie diese hier
set Variable1=%Variablex:~ 2, 5%
set variable2=%Variabley:moment=warte%
echo zum Beispiel geht es wie hier umständlich %Variable2% und %Variable1% >Beispiel.txt
zu was werden die Variable1 und Variable2 erst festgelegt?....Hmmmmm?....Richtig um die Batch zu füllen.
das geht doch einfacher wenn die ersten zwei Zeilen erst gar nicht geschrieben werden sondern nur in die letzte Zeile so geschrieben wird:
echo zum Beispiel geht es wie hier umständlich %Variabley:moment=warte% und %Variablex:~ 2, 5% >Beispiel.txt
Inhaltsverzeichnis

ist mal wieder was neues dazugekommen! wenn ich wieder Zeit habe gehts weiter Updated at last: 27.08.2009 03:08

Content-ID: 117069

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

Ausgedruckt am: 23.11.2024 um 08:11 Uhr

Netzheimer
Netzheimer 29.05.2009 um 07:56:38 Uhr
Goto Top
Guten Morgen.

Alles in allem eine gute Zusammenfassung. Leicht verständlich geschrieben und auch mit Beispielen durchsetzt. Bleib dran, dann wird es sicher ein gutes Tuto.

Netzheimer
aqui
aqui 12.06.2009 um 10:30:59 Uhr
Goto Top
Nur an der kryptischen Überschrift "...Erstellung erstellen Umgang Erweitungen erweitern Veränderungen verändern,.. ?? " scheitert jeder Dekodierungsversuch face-sad
pieh-ejdsch
pieh-ejdsch 12.06.2009 um 10:50:00 Uhr
Goto Top
Das soll der Ersatz für Suchtags sein.
Wenn man also nach erweitern von Umgebungsvariablen sucht wird Dir die Forumsuche bzw Google (es ist ja mehrmals im Text und in der Überschrift) ein besseres Ergebnis anzeigen.
Sollte das aus der Sicht eines Admin nicht notwendig sein bitte ich natürlich um Verzeihung, und werde in Zukunft solche Suchtags nicht einbauen. Um jegliche Dekodierungsversuche entfallen zu lassen.
Oder hast Du dafür einen Besseren Vorschlag, wobei die Forumsuche dann aber nur die Überschriften durchsuchen soll und trotzdem diesen Beitrag Findet?
Oder Du nennst mir dann den Grund warum die Googlesuche gleich auf Platz 2 ist.

Gruß Phil
evinben
evinben 31.03.2012 um 20:43:52 Uhr
Goto Top
Hallo Phil,

danke dir für die umfangreichliche Anleitung.
Auf der Suche nach „Variable erweitern“ bin ich mit Google-Pilot direkt hierher gelandet.
Könntest du bitte in deiner Anleitung noch hinzufügen, wie ein Pfad der Variable erweitert werden kann (wenn es geht ohne den Batch zu verlassen)?
Beispiel:
set var=%%windir%%\System32\wscript.exe
Nun soll der Pfad erweitert werden, damit er z. B. mit ECHO wie folgt vollständig angezeigt wird:
C:\Windows\System32\wscript.exe
Mit
call echo %var%
:bzw. mit
call echo %var%>tmp.txt
wird der Pfad zwar erweitert angezeigt und ausgegeben. Gibt es vielleicht eine einfache Möglichkeit den Pfad in demselben Batch zu erweitern und gleich in eine neue Variable zu setzen (also ohne den Batch verlassen zu müssen)?

Gruß
evinben
pieh-ejdsch
pieh-ejdsch 02.04.2012 um 21:49:43 Uhr
Goto Top
moin evinben,

Ich werde noch entsprechend Weitere Punkte oben einbauen.

Wenn Du im Batch so stehen hast
echo %%windir%%\system32\wscript.exe
wird Dir nur
%windir%\system32\wscript.exe
ausgegeben.
Der Inhalt der Varible ist massgebend - nicht die Ausgabe.

Es wird immer das ausgegeben, was in die Variable hinein kommt.
Brauchbar ist das ganze zB. wenn ein Batch einen anderen Batch schreibt

Wenn Du einzelne Prozentzeichen (also im Batch doppelt) in die Variable hineinschreibst wird die Variable genau so ausgegeben.
Daher ist das für den Call (Gewissermassen verlässt Du den Batch nicht, sonder Startest einen neuen CMD-Kontex innerhalb des Batches) genauso zu werten wie für Set.
Zu sehen ist das ganze wunderbar in einer Forschleife, wenn Do Befehl angezeigt wird.

Wenn Du einen Batch ausführst, auf Deinem System sind die UmgebungsVariablen so definiert, wie sie gebraucht werden.
Die Harte Codierung ensteht dabei zwangsläufig erst wenn eine Variable mit Vorangesetzter Umgebungsvariable Erstellt wird. (also wenn Du die Befehlsausgabe vom Batch im CMD-Fenster beobachtest.)
set var=%windir%\System32\wscript.exe
Die Ausgabe ist dann
set var=C:\Windows\System32\wscript.exe
Genau so wie Du es brauchst um einen VariablenInhalt in die NeuVariable mitaufzunehmen.
Du brauchst ja nur den Inhalt.

Gruß Phil
evinben
evinben 03.04.2012 um 00:47:29 Uhr
Goto Top
Hallo Phil,

danke dir - es freut mich sehr, dass deine Anleitung doch erweitert und gepflegt wird.

Das Problem ist, wenn du mit IF prüfen möchtest, ob das Ziel vorhanden ist, z. B. so:
if not exist %var% echo Die Qelle ist nicht vorhanden

Dann ist das Ergebnis der Prüfung leider: Die Qelle ist nicht vorhanden
Wenn allerdings auf "C:\Windows\System32\wscript.exe" geprüft wird, dann gehts natürlich fehlerfrei.

So (oder über einer :Marke) geht es leider nicht:
call if not exist %var% echo Die Qelle ist nicht vorhanden

Was für eine Abhilfe gäbe es hierfür?

Gruß
evinben
MichaelW84
MichaelW84 29.10.2015 aktualisiert um 09:33:19 Uhr
Goto Top
Versuche es mal so:

if exist "%var%" (call :meinSprung  
) else (
Echo die Quelle ist nicht vorhanden) 

Du könntest dann auch eine Sprung Marke aufrufen.
evinben
evinben 29.10.2015 aktualisiert um 16:37:05 Uhr
Goto Top
danke face-wink - auch wenn es sich bei mir vor drei Jahren erledigt hat, aber für die anderen Mitglieder ist der Tipp sicherlich nützlich