if exist innerhalb for -Schlaufe funktioniert nicht
Trotz den div. Hinweisen zu set innerhalb for-Schleifen, habe ich den Dreh noch nicht raus:
Hallo zusammen
Im folgenden Skriptteil, prüfe ich (danke Eurer Unterstützung) mit einer Schlaufe in einem Verzeichnis eine Liste von Dateien.
Wenn von heute noch keine Datei vorliegt, soll eine ältere Datei auf die heutige Datei umbenannt werden.
Wie ich feststellen musste, gibt ren aber keinen Errorlevel aus.
Also, habe ich mir gedacht, baue ich in die Schlaufe nach dem Rename noch eine Abfrage ein, ob die soeben umbenannte Datei noch existiert und würde dann auf Error gehen.
Der untenstehende Skriptteil macht nun folgendes:
Er nimmt ein älteres File z.B. 20090810.txt und nennt es auf 20090813.txt um.
Dann folgt die Prüfung, ob 20090810 noch da ist. Was ja nicht mehr der Fall ist. (Ist im Explorer auch ersichtlich). Trotzdem gibt das Skript die Zeile "... ERROR: rename "20090810.txt" nicht erfolgreich " aus.
Zuerst dachte ich, dass es evtl. im falschen Verzeichnis nachguckt, aber zwei, drei Zeilen weiter oben, hat ja das rename im richtigen Verzeichnis funktioniert. Die richtige Datei sucht es auch (gem. Log: 20090810.txt).
Ich blick da leider nicht durch. Ihr vielleicht`
Gruss
Jim
set FILENAME-TODAY=20090813.txt
:CHECKTXTTODAY
if not exist "%FILENAME-TODAY%" (
for /f "delims=" %%i in ('dir /b /a-d "*.txt" 2^>nul') do (ren "%%i" "%FILENAME-TODAY%"
if exist "%%i" do (
echo ... ERROR: rename "%%i" nicht erfolgreich >> %JOBLOG%
goto :Error
)
echo ... INFO: rename "%%i" "%FILENAME-TODAY%" >> %JOBLOG%
call :CHECKERRORLEVEL
goto :APPENDIDX
)
)
LOG:
... ERROR: rename "20090810.txt" nicht erfolgreich
Hallo zusammen
Im folgenden Skriptteil, prüfe ich (danke Eurer Unterstützung) mit einer Schlaufe in einem Verzeichnis eine Liste von Dateien.
Wenn von heute noch keine Datei vorliegt, soll eine ältere Datei auf die heutige Datei umbenannt werden.
Wie ich feststellen musste, gibt ren aber keinen Errorlevel aus.
Also, habe ich mir gedacht, baue ich in die Schlaufe nach dem Rename noch eine Abfrage ein, ob die soeben umbenannte Datei noch existiert und würde dann auf Error gehen.
Der untenstehende Skriptteil macht nun folgendes:
Er nimmt ein älteres File z.B. 20090810.txt und nennt es auf 20090813.txt um.
Dann folgt die Prüfung, ob 20090810 noch da ist. Was ja nicht mehr der Fall ist. (Ist im Explorer auch ersichtlich). Trotzdem gibt das Skript die Zeile "... ERROR: rename "20090810.txt" nicht erfolgreich " aus.
Zuerst dachte ich, dass es evtl. im falschen Verzeichnis nachguckt, aber zwei, drei Zeilen weiter oben, hat ja das rename im richtigen Verzeichnis funktioniert. Die richtige Datei sucht es auch (gem. Log: 20090810.txt).
Ich blick da leider nicht durch. Ihr vielleicht`
Gruss
Jim
set FILENAME-TODAY=20090813.txt
:CHECKTXTTODAY
if not exist "%FILENAME-TODAY%" (
for /f "delims=" %%i in ('dir /b /a-d "*.txt" 2^>nul') do (ren "%%i" "%FILENAME-TODAY%"
if exist "%%i" do (
echo ... ERROR: rename "%%i" nicht erfolgreich >> %JOBLOG%
goto :Error
)
echo ... INFO: rename "%%i" "%FILENAME-TODAY%" >> %JOBLOG%
call :CHECKERRORLEVEL
goto :APPENDIDX
)
)
LOG:
... ERROR: rename "20090810.txt" nicht erfolgreich
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 122677
Url: https://administrator.de/forum/if-exist-innerhalb-for-schlaufe-funktioniert-nicht-122677.html
Ausgedruckt am: 09.04.2025 um 13:04 Uhr
9 Kommentare
Neuester Kommentar

Servus,
kann ich leider nicht nachvollziehen
bzw. im Ordner Test - wo es eine Test.ini gibt:
Von daher würde ich den ganzen Salat mal genauer betrachten wollen, bevor ich dazu ne Aussage mache.
Welche "Unterstützung" / Thread meinst du?
Gruß
Wie ich feststellen musste, gibt ren aber keinen Errorlevel aus.
kann ich leider nicht nachvollziehen
ren a b
echo %errorlevel%
1
echo %errorlevel%
1
bzw. im Ordner Test - wo es eine Test.ini gibt:
C:\test>ren test.ini test.ini.ini
C:\test>echo %errorlevel%
C:\test>echo %errorlevel%
Von daher würde ich den ganzen Salat mal genauer betrachten wollen, bevor ich dazu ne Aussage mache.
Im folgenden Skriptteil, prüfe ich (danke Eurer Unterstützung) mit einer Schlaufe in einem Verzeichnis eine Liste von Dateien.
Welche "Unterstützung" / Thread meinst du?
Gruß
Ich würde da mit
starten, und im besagten Abschnitt
Ob das so schon funktioniert, musst du ausprobieren. Prinzip ist aber, überall wo eine Variale zur Laufzeit einer Befehlszeile mehrfach expandiert werden soll (auch wenn die Zeile auf mehrere verteilt wurde
) statt % entsprechende ! verwenden.
Grüße
rubberman
@echo off &setlocal enabledelayedexpansion
if not exist "%FILENAME-TODAY%" (
for /f "delims=" %%i in ('dir /b /a-d "*.txt" 2^>nul') do (
ren "%%i" "!FILENAME-TODAY!"
if exist "%%i" do (
echo ... ERROR: rename "%%i" nicht erfolgreich >> !JOBLOG!
goto :Error
echo ... INFO: rename "%%i" "!FILENAME-TODAY!" >> !JOBLOG!
call :CHECKERRORLEVEL
goto :APPENDIDX
)
)
)
Ob das so schon funktioniert, musst du ausprobieren. Prinzip ist aber, überall wo eine Variale zur Laufzeit einer Befehlszeile mehrfach expandiert werden soll (auch wenn die Zeile auf mehrere verteilt wurde
Grüße
rubberman
@rubberman
Solange sich nicht der gesamte dargestellte Batch(teil) selbst in einer Schleife befindet, ist "delayedExpansion" nicht nötig, da ja innerhalb der Schleife keine Variable einen neuen Wert erhält ...
@Jim-Knopf
Unter der Annahme, dass es nur eine einzige (wenn auch namentlich nicht bekannte) Textdatei im aktuellen Ordner gibt (ansonsten würde ja das "Rename" ohnehin nur einmal funktionieren können), würde eigentlich ein simples
genügen - egal, wie die Datei vorher geheißen haben sollte, danach heißt sich sicher "%FILENAME-TODAY%" (es sei denn, sie wäre versteckt oder hätte das "System"-Attribut gesetzt - entsprechende NTFS-Rechte setze ich mal voraus) ...
Die "gewöhnliche" Kontrolle des "ren" per Errorlevel könnte etwa so aussehen:
aber falls Du den Erfolg tatsächlich "hintenrum" prüfen willst, sollte es zB so klappen:
Grüße
bastla
P.S.:

... insbesondere auch, da ja für wirklich robuste Programmierung sogar empfohlen wird: "Knoten statt Schleifen!"
Solange sich nicht der gesamte dargestellte Batch(teil) selbst in einer Schleife befindet, ist "delayedExpansion" nicht nötig, da ja innerhalb der Schleife keine Variable einen neuen Wert erhält ...
@Jim-Knopf
Unter der Annahme, dass es nur eine einzige (wenn auch namentlich nicht bekannte) Textdatei im aktuellen Ordner gibt (ansonsten würde ja das "Rename" ohnehin nur einmal funktionieren können), würde eigentlich ein simples
ren *.txt "%FILENAME-TODAY%"
Die "gewöhnliche" Kontrolle des "ren" per Errorlevel könnte etwa so aussehen:
ren "%%i" "%FILENAME-TODAY%" || (echo ... ERROR: rename "%%i" nicht erfolgreich & goto :Error)
:CHECKTXTTODAY
if not exist "%FILENAME-TODAY%" (
for /f "delims=" %%i in ('dir /b /a-d "*.txt" 2^>nul') do (
ren "%%i" "%FILENAME-TODAY%"
type "%%i">nul 2>nul && (echo ... ERROR: rename "%%i" nicht erfolgreich & goto :Error)
echo ... INFO: rename "%%i" "%FILENAME-TODAY%"
call :CHECKERRORLEVEL
goto :APPENDIDX
)
)
Grüße
bastla
P.S.:
... (danke Eurer Unterstützung) mit einer Schlaufe ...
Ich bezweifle, dass irgendjemand hier im Forum zum Scripten mit "Schlaufen" beigetragen hat ... ... insbesondere auch, da ja für wirklich robuste Programmierung sogar empfohlen wird: "Knoten statt Schleifen!"
Hallo Jim-Knopf!
... allerdings ist der Errorlevel dann 1 - soferne er richtig abgefragt wird, also entweder mit
oder gleich direkt an den "ren"-Befehl angefügt:
Was (in einer Schleife) nicht klappen kann, ist, die Variable %errorlevel% abzufragen; hier tritt der von rubberman angesprochene Fall ein, dass Du dafür vorweg
und für die Abfrage die Schreibweise
benötigst.
Grüße
bastla
Erstell aber mal eine Datei a.txt und b.txt. Setze beide auf schreibgeschützt und gib ren a.txt. b.txt ein. Das Rename klappt nicht und der Errorlevel bleibt 0. Wieso auch immer.
Den Schreibschutz braucht's gar nicht - wenn eine gleichnamige Datei existiert, funktioniert das "Rename" nicht ...... allerdings ist der Errorlevel dann 1 - soferne er richtig abgefragt wird, also entweder mit
if errorlevel 1 echo Fehler
ren a.txt b.text || echo Fehler
setlocal enabledelayedexpansion
if !errorlevel! gtr 0 echo Fehler
Grüße
bastla