jim-knopf
Goto Top

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

Content-Key: 122677

Url: https://administrator.de/contentid/122677

Ausgedruckt am: 29.03.2024 um 13:03 Uhr

Mitglied: 60730
60730 13.08.2009 um 12:44:10 Uhr
Goto Top
Servus,

Wie ich feststellen musste, gibt ren aber keinen Errorlevel aus.

kann ich leider nicht nachvollziehen
ren a b
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%


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ß
Mitglied: rubberman
rubberman 13.08.2009 um 12:49:19 Uhr
Goto Top
Ich würde da mit
@echo off &setlocal enabledelayedexpansion
starten, und im besagten Abschnitt
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 face-wink ) statt % entsprechende ! verwenden.

Grüße
rubberman
Mitglied: bastla
bastla 13.08.2009 um 14:32:23 Uhr
Goto Top
@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
ren *.txt "%FILENAME-TODAY%"
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:
ren "%%i" "%FILENAME-TODAY%" || (echo ... ERROR: rename "%%i" nicht erfolgreich & goto :Error)
aber falls Du den Erfolg tatsächlich "hintenrum" prüfen willst, sollte es zB so klappen:
: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 ... face-wink

... insbesondere auch, da ja für wirklich robuste Programmierung sogar empfohlen wird: "Knoten statt Schleifen!" face-wink
Mitglied: Jim-Knopf
Jim-Knopf 13.08.2009 um 15:50:59 Uhr
Goto Top
Hi rubberman

Besten Dank. Hab' mal % durch ! ersetzt.. dann ging gar nichts mehr. D.h. die >> !Joblog! wurde nicht ausgegeben. Hab's wieder zurück auf >> %Joblog% geändert. Dann ging's wieder.

Ich glaube die Ursache am Tilt lag mehr daran, dass ein "do" im if exist nicht hingehörte:
Folgender Skriptteil scheint zu funktionieren:


:APPENDTXT
for /f "delims=" %%i in ('dir /b /a-d "*.txt" 2^>nul^|findstr /i /v /c:"%FILENAME-TODAY%"') do (
type "%%i">>"%FILENAME-TODAY%"
echo ... INFO: append von %%i in "%FILENAME-TODAY%" >> %JOBLOG%
del "%%i"

if exist %%i (
echo ... ERROR: delete "%%i" nicht erfolgreich >> %JOBLOG%
goto :Error
)

echo ... INFO: %%i geloescht >> %JOBLOG%

)

Troztdem vielen Dank für Deine Hilfe.

Gruss
Jim
Mitglied: Jim-Knopf
Jim-Knopf 13.08.2009 um 17:08:40 Uhr
Goto Top
Hi Timo

Danke für den Input betr. Errorlevel und Rename.
Ich hab's so ausprobiert wie Du beschrieben hast und ich hab dieselben Resulate erhalten.

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.

Dasselbe bei Delete.

Wie schon erwähnt habe ich aber festgestellt, dass das DO nach dem if exist überflüssig ist.
Der Check funktioniert also wie folgt:

:CHECKTXTTODAY
if not exist "%FILENAME-TODAY%" (
echo nach exist
pause
for /f "delims=" %%i in ('dir /b /a-d "*.txt" 2^>nul') do (ren "%%i" "%FILENAME-TODAY%"
if exist "%%i" (
echo ... ERROR: rename "%%i" nicht erfolgreich >> %JOBLOG%
goto :Error
)
echo ... INFO: rename "%%i" "%FILENAME-TODAY%" >> %JOBLOG%
goto :APPENDTXT
)
)

Vielen Dank für Eure Unterstützung.

Gruss
Jim
Mitglied: Jim-Knopf
Jim-Knopf 13.08.2009 um 17:16:25 Uhr
Goto Top
Hi bastla

Ob Schlaufen oder Schliefen. Hauptsache immer im Kreis. face-smile
Die Problematik ist aus der ersten Anfrage, die von Dir supercool beantwortet wurde, ja etwas komplexer.

Da mein Vorschlag nun doch noch irgendwie funktioniert, bin ich damit aber vorerst mal voll happy.

Gruss
Jim
Mitglied: bastla
bastla 13.08.2009 um 17:21:39 Uhr
Goto Top
Hallo Jim-Knopf!
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
oder gleich direkt an den "ren"-Befehl angefügt:
ren a.txt b.text || echo Fehler
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
setlocal enabledelayedexpansion
und für die Abfrage die Schreibweise
if !errorlevel! gtr 0 echo Fehler
benötigst.

Grüße
bastla
Mitglied: Jim-Knopf
Jim-Knopf 13.08.2009 um 20:42:27 Uhr
Goto Top
Hi bastla

Ich bin schon ein wenig neidisch über all Dein Wissen. face-wink
Super herzlichen Dank.
Erst wir mir einiges klarer, wieso die Errorlevelabfrage mal klappte und an anderer Stelle nicht.
Grummel.

Aber super herzlichen Dank für Dein Infos.
Werde mich morgen gleich wieder dahinter klemmen face-smile

Viele Grüsse
Jim
Mitglied: Biber
Biber 14.08.2009 um 14:27:17 Uhr
Goto Top
Moin Jim-Knopf,

hast Du es nun denn heute den ganzen Tag über zu Ende verifiziert?
Können wir einen haken dran machen?

Ich möchte ja in "Batch & Shell" die Dinge nicht so schlaufen lassen... face-wink

Grüße
Biber