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.
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
es gibt Unterschiedliche Arten von Variablen
um mit UmgebungsVariablen im Batch zu Arbeiten, musst Du erst mal eine Variable erstellten.
Inhaltsverzeichnis
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.
um negative Zahlen als Variable anzugeben ein - (minus) hinter das = setzen
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.
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.
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
Inhaltsverzeichnis
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.
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.
dabei zeigt Dir die Zeichenfolge vor dem = den Variablenname und die Zeichenfolge nach dem = den Wert für die Variable an
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.
dahinter schreibst Du Deinen Befehl der Ausgeführt werden soll wenn NeueVariable existiert
Inhaltsverzeichnis
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
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.
Beispiele:
Inhaltsverzeichnis
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.
Inhaltsverzeichnis
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.
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.
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.
Inhaltsverzeichnis
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
Sticky: in manchen Batches sehe ich ähnliche Zeilen wie diese hier
das geht doch einfacher wenn die ersten zwei Zeilen erst gar nicht geschrieben werden sondern nur in die letzte Zeile so geschrieben wird:
ist mal wieder was neues dazugekommen! wenn ich wieder Zeit habe gehts weiter Updated at last: 27.08.2009 03:08
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.
Wie 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
Variablen 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,
- 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
(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
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 Variableset 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
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.
Numerische 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.
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
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
Wert 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.
Umgang 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.
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.
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
InhaltsverzeichnisExistens von Variablen prüfen mit SET
der Befehl SET ohne nachträgliche Eingaben zeigt alle derzeit gesetzten Umgebungsvariablen und Systemvariablen andabei 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 NeueVariableset 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"
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 DEFINEDset ??
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 NOTif 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
InhaltsverzeichnisErweitern 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
Erweitern 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
set a=BeispielVariable
echo %a:~ 7, 3%
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%!
InhaltsverzeichnisErweitern von UmgebungsVariablen mit Ersetzen
beim Ersetzen von Zeichen oder Zeichenabfolgen werden die Variablen nur anders angezeigt und nicht verändertdazu 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 |
UmgebungsVariablen Löschen und Wiederherstellen. Wofür ist SETLOCAL und ENDLOCAL
Löschen von UmgebungsVariablen
gesetzte Variablen belegen Speicher und begrenzen auch die Aufnahmekapazität weiterer Variablenandere 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!
Verwenden 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!
Besonderheiten 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
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.set variable2=%Variabley:moment=warte%
echo zum Beispiel geht es wie hier umständlich %Variable2% und %Variable1% >Beispiel.txt
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
Inhaltsverzeichnisist mal wieder was neues dazugekommen! wenn ich wieder Zeit habe gehts weiter Updated at last: 27.08.2009 03:08
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 117069
Url: https://administrator.de/contentid/117069
Ausgedruckt am: 22.11.2024 um 17:11 Uhr
8 Kommentare
Neuester Kommentar
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:
Nun soll der Pfad erweitert werden, damit er z. B. mit ECHO wie folgt vollständig angezeigt wird:
C:\Windows\System32\wscript.exe
Mit
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
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
C:\Windows\System32\wscript.exe
Mit
call echo %var%
:bzw. mit
call echo %var%>tmp.txt
Gruß
evinben
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:
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:
Was für eine Abhilfe gäbe es hierfür?
Gruß
evinben
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