progfreund
Goto Top

Batch Anfänger Fragen zu setlocal, enabledelayedexpansion, set, for

Was ist setlocal, was ist enabledelayedexpansion? Warum %%-Zeichen in FOR-Schleifen? Kurzschreibweise bei set. Wie kann ich mit abgefragten Variablen eine Zeichenkette bearbeiten?

Obwohl ich schon früher mit batch gearbeitet habe, habe ich aus
Interesse gestern wieder angefangen, doch ich muss sagen, dass
ich noch zu große Lücken im Beherrschen der Syntax habe.


Wofür steht am Scriptanfang
@echo off & setlocal
bzw.
@echo off & setlocal enabledelayedexpansion
und warum beendet man es?


Bsp.1 Zeile 06
for %%i in (%T%) do set /a LenVar=%%~zi-2
Wofür steht die -2 und warum die doppelten %%?


Bsp.2 Zeile 07:
if "!Variable:~%LenVar%,1!"=="" goto :Done  
Warum stehen da die Ausrufezeichen statt der Prozentzeichen?


Bsp.2 Zeile 12:
endlocal & set /a LenVar=%LenVar%
Was bedeutet diese Addition?


Bsp.3 Zeile 09:
set "T=%T:~,-1%"  
Wird die Variable T auf den Wert T minus letztes Zeichen gesetzt? Also C:\ --> C: ?

Meine letzte Frage bezieht sich auf mein Skript (s.u.):
Wie kann ich mit abgefragten Variablen eine Zeichenkette bearbeiten?
ähnlich dem Muster %time:~0,2%
@set Bearbeitung=%Stringeingabe:~%Startwert%,%Endwert%%.

Script:
@echo off
@title Token Test
@echo.
@echo =========================================================
@echo.
@echo Dieses Programm gibt die von Ihnen eingegebene
@echo Stringkette (Zeichenkette) gemaess Ihrer Auswahl aus.
@echo Der String wird ab einer Anfangsposition auf soviele
@echo folgende Stellen wiedergegeben.
@echo.
@echo Beispiel String "Hallo, Meister Mueller." mit dem  
@echo Startwert 1 und dem Endwert 4 ergibt: "allo"  
@echo.
@echo Der Programmcode der Ausgabe soll so funktionieren:
@echo ^@echo %%Stringeingabe:~%%Startwert%%,%%Endwert%%%%
@echo.
@echo =========================================================
@echo.
@echo.
@set /p Stringeingabe="Bitte geben Sie den String ein: "  
@echo Sie gaben folgenden String ein: "%Stringeingabe%"  
@echo.
@set /p Startwert="Bitte geben Sie den Startwert ein: "  
@echo Sie gaben folgenden Startwert ein: "%Startwert%"  
@echo.
@set /p Endwert="Bitte geben Sie den Endwert ein: "  
@echo Sie gaben folgenden Endwert ein: "%Endwert%"  
@echo.
@echo.
@echo Es wird nun der von Ihnen eingegebene String mit dem Parameter
@echo (Startwert,Endwert) also (%Startwert%,%Endwert%) ausgegeben.
@echo.
@set Bearbeitung=%Stringeingabe:~%Startwert%,%Endwert%%
@echo Dies ist der Ausgabewert: "%Bearbeitung%"  
@echo.
@set Startwert=""  
@set Endwert=""  
@set Bearbeitung=""  
pause
exit

Wenn ihr mir diese Fragen beantworten könntet, würde ich mich sehr freuen.
Liebe Grüße

Content-Key: 166740

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

Printed on: April 25, 2024 at 10:04 o'clock

Member: bastla
bastla May 23, 2011, updated at Jun 28, 2013 at 21:04:08 (UTC)
Goto Top
Hallo Progfreund!

Hier die gewünschte Zusammenfassung / Wiederholung der schon per PM besprochenen Fragen:
Wofür steht am Scriptanfang
@echo off & setlocal
Mit "@echo off" wird zunächst dafür gesorgt, dass nicht immer zuerst der Befehl, der ausgeführt werden soll, angezeigt wird; "@" alleine dient auch dazu, allerdings nur für den Befehl, dem es vorangestellt wird, während "echo off" diese Anzeigen generell abschaltet - insofern kannst Du daher in Deinem dargestellten Code alle außer dem ersten "@" entfernen ...

"setlocal" beschränkt die Variablengültigkeit, sodass alle Änderungen an Variablenwerten (inklusive jener Variablen, die danach neu erstellt werden) nach einem "endlocal" wieder "vergessen" werden (und damit auf zB den aktuellen Batch beschränkt bleiben). Bei Ende eines Batches wird übrigens automatisch ein "endlocal" ausgeführt, weshalb es zwar angegeben werden kann, aber nicht muss - für Deinen Code bedeutet das, dass Du das "Löschen" mit
set Startwert=""
(das, ganz nebenbei, zwei Anführungszeichen in die Variable geschrieben hätte - richtig wäre
set "Startwert="
oder auch ganz ohne Anführungszeichen, aber auch nix anderem nach dem "=") gar nicht benötigst.
bzw.
@echo off & setlocal enabledelayedexpansion
und warum beendet man es?
Die "delayed Expansion" (von Variablenwerten) ändert die Regeln für das Lesen der Variableninhalte - im Normalfall werden diese Inhalte nur am Beginn einer Zeile ermittelt; ändern sie sich innerhalb der Zeile, wird diese Änderung zwar gespeichert, aber erst am Beginn der nächsten Zeile "bemerkt" - Beispiel:
D:\>dir B:\ & echo %errorlevel% 
Das System kann den angegebenen Pfad nicht finden. 
0 

D:\>echo %errorlevel% 
1
Obwohl der "dir"-Befehl einen Fehler (und die dazugehörige Meldung) verursacht hat, wird zunächst als Errorlevel 0 ausgegeben (der Wert von "%errorlevel%" wurde schon vor dem fehlerhaften "dir") ermittelt.

Mit "setlocal enabledelayedexpansion" kann diese Wertermittlung "verzögert" werden, sodass erst bei Bedarf der aktuelle Wert der Variablen ausgelesen wird; damit der Interpreter das tut, muss auch die Variablenschreibweise von "%Variable%" auf "!Variable!" geändert werden (was eine weitere Frage beantwortet haben sollte face-wink).
for %%i in (%T%) do set /a LenVar=%%~zi-2
Wofür steht die -2 und warum die doppelten %%?
Dieser Workaround ist ein "Biber-Special" face-wink (also nicht auf meinem Mist gewachsen) - es wird einfach eine Variable in eine temporäre Datei ausgegeben, mit der angegebenen Zeile die Dateigröße in Byte ermittelt und 2 Byte (für die Zeilenschaltung CrLf, die automatisch am Ende der Zeile angefügt wurde) abgezogen ...

Hinsichtlich der doppelten Prozentzeichen: Innerhalb eines Batches müssen die Laufvariablen einer "for"-Schleife so gekennzeichnet werden.
endlocal & set /a LenVar=%LenVar%
Was bedeutet diese Addition?
Das ist keine Addition, sondern nur ein Trick, um einen Variableninhalt "mitzunehmen": Wie oben beschrieben, würde der Wert von "%LenVar%" nach dem "endlocal" nicht mehr zur Verfügung stehen; da aber am Beginn der Zeile der Wert noch vorhanden ist (für die Schreibweise mit "%" und nicht "!" wird ja keine "delayed Expansion" durchgeführt), kann dieser Wert einfach nochmals in die Variable geschrieben werden - dies passiert nach dem "endlocal", womit der Wert erhalten bleibt.
set "T=%T:~,-1%"
Wird die Variable T auf den Wert T minus letztes Zeichen gesetzt? Also C:\ --> C: ?
Richtig - ich habe (schreibfaul, wie ich nunmal oft bin face-wink) die 0 vor dem Komma eingespart - damit wäre das noch besser lesbar als: Bilde einen Teilstring, indem Du 0 Zeichen links überspringst und dann alle Zeichen bis zum vorletzten (bzw eben letzten - 1) verwendest; siehe dazu "set /?"
Wie kann ich mit abgefragten Variablen eine Zeichenkette bearbeiten?
ähnlich dem Muster %time:~0,2%
@set Bearbeitung=%Stringeingabe:~%Startwert%,%Endwert%%.
Entweder verwendest Du "delayedexpansion" und die Schreibweise
set Bearbeitung=!Stringeingabe:~%Startwert%,%Endwert%!
oder Du nutzt eine per "call" erzeugt weitere Batch-Instanz (und musst die "gewünschten" Prozentzeichen dafür verdoppeln):
call set Bearbeitung=%%Stringeingabe:~%Startwert%,%Endwert%%%
Am Beispiel Deines Codes die Variante 2:
@echo off & setlocal
title Token Test
echo.
echo =========================================================
echo.
echo Dieses Programm gibt die von Ihnen eingegebene
echo Stringkette (Zeichenkette) gemaess Ihrer Auswahl aus.
echo Der String wird ab einer Anfangsposition auf soviele
echo folgende Stellen wiedergegeben.
echo.
echo Beispiel String "Hallo, Meister Mueller." mit dem  
echo Startwert 1 und dem Endwert 4 ergibt: "allo"  
echo.
echo Der Programmcode der Ausgabe soll so funktionieren:
echo echo %%Stringeingabe:~%%Startwert%%,%%Endwert%%%%
echo.
echo =========================================================
echo.
echo.
set /p Stringeingabe="Bitte geben Sie den String ein: "  
echo Sie gaben folgenden String ein: "%Stringeingabe%"  
echo.
set /p Startwert="Bitte geben Sie den Startwert ein: "  
echo Sie gaben folgenden Startwert ein: "%Startwert%"  
echo.
REM set /p Schrittweite=Bitte geben Sie die Schrittweite ein: "  
REM echo Sie gaben folgende Schrittweite ein: "%Schrittweite%"  
REM echo.
set /p Endwert="Bitte geben Sie den Endwert ein: "  
echo Sie gaben folgenden Endwert ein: "%Endwert%"  
echo.
echo.
echo Es wird nun der von Ihnen eingegebene String mit dem Parameter
echo (Startwert,Endwert) also (%Startwert%,%Endwert%) ausgegeben.
echo.
call set "Bearbeitung=%%Stringeingabe:~%Startwert%,%Endwert%%%"  
echo Dies ist der Ausgabewert: "%Bearbeitung%"  
pause
Noch ein Hinweis auf die Verwendung der Anführungszeichen in Zeile 36: Es handelt sich dabei um eine Möglichkeit, die so gut wie nie Nachteile mit sich bringt, aber vorteilhaft ist, um zB ganz sicher nur die gewünschten Zeichen (und nicht etwa zusätzlich ein oder mehrere Leerzeichen am Ende) in die Variable zu schreiben.
Neben Bibers Tutorials (siehe Link zu seinem Profil oben) kann ich Dir auch noch das Tutorial zur FOR-Schleife von Friemler sehr zum (Wieder-) Einstieg empfehlen ...

Grüße
bastla