Top-Themen

Aktuelle Themen (A bis Z)

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, 29217 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 ..
Ähnliche Inhalte
Batch & Shell
Setlocal enabledelayedexpansion und Sonderzeichen (z.B. !-Zeichen)
Frage von adm2015Batch & Shell2 Kommentare

Hallo Zusammen, ich bin mir sicher, dass dieses Thema schon öfters angesprochen wurde. Leider finde ich hierzu aber nichts. ...

Windows Server
Anfänger Frage zum Thema Migration!
gelöst Frage von Stefan007Windows Server7 Kommentare

Hallo Leute, da das Thema sicherlich viel Raum für Meinungen zulässt, schränke ich das mal nur auf Windows Server ...

Datenbanken
Mysql Anfänger Frage
gelöst Frage von adminstDatenbanken2 Kommentare

Hallo zusammen Ich stehe auf dem Schlauch. Die Frage ist: Ein Mitarbeiter kann mehrere Ausbildungen haben? Danke für kurze ...

Batch & Shell
For Schleife - Robocopy gibt trotz Setlocal EnableDelayedExpansion nur Errorlevel 0 zurück
Frage von michelo82Batch & Shell5 Kommentare

Hallo, und zwar bastel ich an einem Sicherungsskript welches mit Robocopy die Daten kopiert, die Zeit dieses Vorganges misst, ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 4 MinutenWindows 10

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 1 StundeSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 16 StundenInternet2 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 19 StundenDSL, VDSL1 Kommentar

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Heiß diskutierte Inhalte
Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement21 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...

Windows Server
Anmeldung direkt am DC nicht möglich
Frage von ThomasGrWindows Server16 Kommentare

Hallo, ich habe bei unserem Server 2016 Standard ein Problem. Keine Ahnung wie das auf einmal passiert ist. Ich ...

TK-Netze & Geräte
VPN-fähige IP-Telefone
Frage von the-buccaneerTK-Netze & Geräte14 Kommentare

Hi! Weiss noch jemand ein VPN-fähiges IP-Telefon mit dem man z.B. einen Heimarbeitsplatz gesichert anbinden könnte? Habe nur einen ...