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.
Wenn ihr mir diese Fragen beantworten könntet, würde ich mich sehr freuen.
Liebe Grüße
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%
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 166740
Url: https://administrator.de/contentid/166740
Ausgedruckt am: 22.11.2024 um 10:11 Uhr
1 Kommentar
Hallo Progfreund!
Hier die gewünschte Zusammenfassung / Wiederholung der schon per PM besprochenen Fragen:
"
(das, ganz nebenbei, zwei Anführungszeichen in die Variable geschrieben hätte - richtig wäre
oder auch ganz ohne Anführungszeichen, aber auch nix anderem nach dem "=") gar nicht benötigst.
Obwohl der "
Mit "
Dieser Workaround ist ein "Biber-Special" (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 "
Das ist keine Addition, sondern nur ein Trick, um einen Variableninhalt "mitzunehmen": Wie oben beschrieben, würde der Wert von "%LenVar%" nach dem "
Richtig - ich habe (schreibfaul, wie ich nunmal oft bin ) 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 "
oder Du nutzt eine per "
Am Beispiel Deines Codes die Variante 2:
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
Hier die gewünschte Zusammenfassung / Wiederholung der schon per PM besprochenen Fragen:
Wofür steht am Scriptanfang
Mit "@echo off & setlocal
@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" mitset Startwert=""
set "Startwert="
bzw.
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:@echo off & setlocal enabledelayedexpansion
und warum beendet man es?D:\>dir B:\ & echo %errorlevel%
Das System kann den angegebenen Pfad nicht finden.
0
D:\>echo %errorlevel%
1
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 ).for %%i in (%T%) do set /a LenVar=%%~zi-2
Wofür steht die -2 und warum die doppelten %%?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?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: ?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ähnlich dem Muster %time:~0,2%
@set Bearbeitung=%Stringeingabe:~%Startwert%,%Endwert%%.
set Bearbeitung=!Stringeingabe:~%Startwert%,%Endwert%!
call
" erzeugt weitere Batch-Instanz (und musst die "gewünschten" Prozentzeichen dafür verdoppeln):call set Bearbeitung=%%Stringeingabe:~%Startwert%,%Endwert%%%
@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
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