Call in For-Schleife - Irgenwie klappt das nicht
Liebe Administrator-Gemeinde bisher konnten mir Eure Problemstellungen und deren Lösungen meistens weiterhelfen. Diesmal komme ich aber einfach nicht weiter. Ich raff das einfach nicht. Ich hoffe Ihr könnt mir weiterhelfen:
Ich schreibe ein Skript, mit welchem ich Backup-Verzeichnisse aufräumen möchte.
Ich möchte diverse Basisverzeichnisse durchlaufen, die in einem gemeinsamen Rootverzeichnis liegen.
In diesen Basisverzeichnissen liegen nun im Format DD.MM.YYYY Tagessicherungen herum. Wochentags +1 übers Wochenende/Feiertage entsprechend mehr. ist die Platte voll, können bestimmte Tagessicherungsordner auch leer sein.
Mit dem Skript möchte ich zunächst die leeren löschen und danach das aktuellste Verzeichnis stehen lassen und die anderen löschen.
Und das bei beliebig vielen Basisordnern.
Ich habe zunächst es versucht mit ineinander verschachtelten for-Schleifen. Da habe ich recherchiert, dass das nicht geht und bin da auf die CALL-Geschichte gestossen. Aber aus einer For-Schleife (durchwandern der Basisordner) heraus ein paar rein rudimentärer Funktionen mit Call aufzurufen schlägt grandios fehl!
Ich poste hier mal einen vereinfachten Code, mit dem ich mein Problem denke ich gut eingegrenzt habe:
Anstatt, dass nun 10x die Abfolge "blau", "rot", "blau", "gelb" angezeigt wird, wird stattdessen statt der Farbe "Auswaehlen" (so wie es bei der Initiierung festgelegt wurde) ausgegeben (also 4x10=40 Mal). Kommentiere ich nun die for Schleife und die dazugehörige schließende Klammer aus funktioniert es wie gewünscht:
blau
rot
blau
gelb
Könnt Ihr mir als Batch-Linkshänder einmal weiterhelfen? Warum funktioniert das nicht? Wie macht mans richtig?
Ich schreibe ein Skript, mit welchem ich Backup-Verzeichnisse aufräumen möchte.
Ich möchte diverse Basisverzeichnisse durchlaufen, die in einem gemeinsamen Rootverzeichnis liegen.
In diesen Basisverzeichnissen liegen nun im Format DD.MM.YYYY Tagessicherungen herum. Wochentags +1 übers Wochenende/Feiertage entsprechend mehr. ist die Platte voll, können bestimmte Tagessicherungsordner auch leer sein.
Mit dem Skript möchte ich zunächst die leeren löschen und danach das aktuellste Verzeichnis stehen lassen und die anderen löschen.
Und das bei beliebig vielen Basisordnern.
Ich habe zunächst es versucht mit ineinander verschachtelten for-Schleifen. Da habe ich recherchiert, dass das nicht geht und bin da auf die CALL-Geschichte gestossen. Aber aus einer For-Schleife (durchwandern der Basisordner) heraus ein paar rein rudimentärer Funktionen mit Call aufzurufen schlägt grandios fehl!
Ich poste hier mal einen vereinfachten Code, mit dem ich mein Problem denke ich gut eingegrenzt habe:
@echo off & setlocal enabledelayedexpansion
SET col=Auswaehlen
goto All
:BLAU
set col=blau
goto eof
:GELB
set col=gelb
goto eof
:ROT
set col=rot
goto eof
:ALL
echo ----------
for /L %%i in (1,1,10) do @(
call:BLAU col
echo %col%
call:ROT col
echo %col%
call:BLAU col
echo %col%
call:GELB col
echo %col%
)
echo ----------
pause
GOTO ALL
:eof
blau
rot
blau
gelb
Könnt Ihr mir als Batch-Linkshänder einmal weiterhelfen? Warum funktioniert das nicht? Wie macht mans richtig?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 150742
Url: https://administrator.de/contentid/150742
Ausgedruckt am: 22.11.2024 um 21:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo Thror78 und willkommen im Forum!
Wenn Du schon "delayed Expansion" aktivierst, solltest Du es auch verwenden:
Grüße
bastla
Wenn Du schon "delayed Expansion" aktivierst, solltest Du es auch verwenden:
@echo off & setlocal enabledelayedexpansion
SET col=Auswaehlen
goto :ALL
:BLAU
set col=blau
goto :eof
:GELB
set col=gelb
goto :eof
:ROT
set col=rot
goto :eof
:ALL
echo ----------
for /L %%i in (1,1,10) do (
call:BLAU
echo !col!
call:ROT
echo !col!
call:BLAU
echo !col!
call:GELB
echo !col!
)
echo ----------
pause
GOTO :ALL
bastla
Hallo Thror78!
Wenn Du Dir mit "
Sollte das noch nicht genügen, überlege einfach, welches Trennzeichen Du verwenden möchtest - und wenn das Ergebnis "gar keines" lauten sollte, dann baue das entsprechend ein ...
Ansonsten noch ein anderer Hinweis: Die Variablenschreibweise mit "
Ach ja, bevor ich's vergesse (Du hast es nämlich schon ): In Zeile 4 fehlen Anführungszeichen ...
Grüße
bastla
Wenn Du Dir mit "
for /?
" die Hilfe zur "for
"-Schleife ansiehst, wirst Du auchStandardmäßig liefert /F den ersten, durch ein Leerzeichen getrennten Token von jeder Zeile
sowiedelims=xxx - Gibt einen Satz von Trennzeichen an. Diese ersetzen die Standardtrennzeichen TAB und Leerzeichen.
finden.Sollte das noch nicht genügen, überlege einfach, welches Trennzeichen Du verwenden möchtest - und wenn das Ergebnis "gar keines" lauten sollte, dann baue das entsprechend ein ...
Ansonsten noch ein anderer Hinweis: Die Variablenschreibweise mit "
!Variablenname!
" anstatt "%Variablenname%
" ist nur erforderlich, wenn "delayed Expansion" benötigt wird - in Deinem Beispiel oben also nur innerhalb der Schleife (= in Zeile 16, wobei sich 15 und 16 in diesem Fall ja auch auf "echo %%b
" reduzieren ließen, wodurch Du gänzlich auf "delayed Expansion" verzichten könntest) ...Ach ja, bevor ich's vergesse (Du hast es nämlich schon ): In Zeile 4 fehlen Anführungszeichen ...
Grüße
bastla