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

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

Frage Entwicklung

Mitglied: Progfreund

Progfreund (Level 1) - Jetzt verbinden

23.05.2011 um 14:41 Uhr, 24768 Aufrufe, 1 Kommentar

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
01.
@echo off & setlocal
bzw.
01.
@echo off & setlocal enabledelayedexpansion
und warum beendet man es?


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


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


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


Bsp.3 Zeile 09:
01.
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%
01.
@set Bearbeitung=%Stringeingabe:~%Startwert%,%Endwert%%.
Script:
01.
@echo off 
02.
@title Token Test 
03.
@echo. 
04.
@echo ========================================================= 
05.
@echo. 
06.
@echo Dieses Programm gibt die von Ihnen eingegebene 
07.
@echo Stringkette (Zeichenkette) gemaess Ihrer Auswahl aus. 
08.
@echo Der String wird ab einer Anfangsposition auf soviele 
09.
@echo folgende Stellen wiedergegeben. 
10.
@echo. 
11.
@echo Beispiel String "Hallo, Meister Mueller." mit dem 
12.
@echo Startwert 1 und dem Endwert 4 ergibt: "allo" 
13.
@echo. 
14.
@echo Der Programmcode der Ausgabe soll so funktionieren: 
15.
@echo ^@echo %%Stringeingabe:~%%Startwert%%,%%Endwert%%%% 
16.
@echo. 
17.
@echo ========================================================= 
18.
@echo. 
19.
@echo. 
20.
@set /p Stringeingabe="Bitte geben Sie den String ein: " 
21.
@echo Sie gaben folgenden String ein: "%Stringeingabe%" 
22.
@echo. 
23.
@set /p Startwert="Bitte geben Sie den Startwert ein: " 
24.
@echo Sie gaben folgenden Startwert ein: "%Startwert%" 
25.
@echo. 
26.
@set /p Endwert="Bitte geben Sie den Endwert ein: " 
27.
@echo Sie gaben folgenden Endwert ein: "%Endwert%" 
28.
@echo. 
29.
@echo. 
30.
@echo Es wird nun der von Ihnen eingegebene String mit dem Parameter 
31.
@echo (Startwert,Endwert) also (%Startwert%,%Endwert%) ausgegeben. 
32.
@echo. 
33.
@set Bearbeitung=%Stringeingabe:~%Startwert%,%Endwert%% 
34.
@echo Dies ist der Ausgabewert: "%Bearbeitung%" 
35.
@echo. 
36.
@set Startwert="" 
37.
@set Endwert="" 
38.
@set Bearbeitung="" 
39.
pause 
40.
exit
Wenn ihr mir diese Fragen beantworten könntet, würde ich mich sehr freuen.
Liebe Grüße
Mitglied: bastla
23.05.2011, aktualisiert 28.06.2013
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 ).
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" (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 ) 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:
01.
@echo off & setlocal 
02.
title Token Test 
03.
echo. 
04.
echo ========================================================= 
05.
echo. 
06.
echo Dieses Programm gibt die von Ihnen eingegebene 
07.
echo Stringkette (Zeichenkette) gemaess Ihrer Auswahl aus. 
08.
echo Der String wird ab einer Anfangsposition auf soviele 
09.
echo folgende Stellen wiedergegeben. 
10.
echo. 
11.
echo Beispiel String "Hallo, Meister Mueller." mit dem 
12.
echo Startwert 1 und dem Endwert 4 ergibt: "allo" 
13.
echo. 
14.
echo Der Programmcode der Ausgabe soll so funktionieren: 
15.
echo echo %%Stringeingabe:~%%Startwert%%,%%Endwert%%%% 
16.
echo. 
17.
echo ========================================================= 
18.
echo. 
19.
echo. 
20.
set /p Stringeingabe="Bitte geben Sie den String ein: " 
21.
echo Sie gaben folgenden String ein: "%Stringeingabe%" 
22.
echo. 
23.
set /p Startwert="Bitte geben Sie den Startwert ein: " 
24.
echo Sie gaben folgenden Startwert ein: "%Startwert%" 
25.
echo. 
26.
REM set /p Schrittweite=Bitte geben Sie die Schrittweite ein: " 
27.
REM echo Sie gaben folgende Schrittweite ein: "%Schrittweite%" 
28.
REM echo. 
29.
set /p Endwert="Bitte geben Sie den Endwert ein: " 
30.
echo Sie gaben folgenden Endwert ein: "%Endwert%" 
31.
echo. 
32.
echo. 
33.
echo Es wird nun der von Ihnen eingegebene String mit dem Parameter 
34.
echo (Startwert,Endwert) also (%Startwert%,%Endwert%) ausgegeben. 
35.
echo. 
36.
call set "Bearbeitung=%%Stringeingabe:~%Startwert%,%Endwert%%%" 
37.
echo Dies ist der Ausgabewert: "%Bearbeitung%" 
38.
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
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
gelöst BATCH: Minuszeichen in set-Befehl (3)

Frage von Schottenrock zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch-bei set in der Mitte schreiben? (5)

Frage von Jonas1806 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch: (at)set und (at)echo in For-Schleifen? und mehr (8)

Frage von Ben.Blake.79 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

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

Frage von Motte990 zum Thema Microsoft Office ...