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

if exist innerhalb for -Schlaufe funktioniert nicht

Frage Entwicklung Batch & Shell

Mitglied: Jim-Knopf

Jim-Knopf (Level 1) - Jetzt verbinden

13.08.2009, aktualisiert 12:15 Uhr, 4286 Aufrufe, 9 Kommentare

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
Mitglied: 60730
13.08.2009 um 12:44 Uhr
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%
0

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ß
Bitte warten ..
Mitglied: rubberman
13.08.2009 um 12:49 Uhr
Ich würde da mit
01.
@echo off &setlocal enabledelayedexpansion
starten, und im besagten Abschnitt
01.
if not exist "%FILENAME-TODAY%" ( 
02.
 for /f "delims=" %%i in ('dir /b /a-d "*.txt" 2^>nul') do ( 
03.
  ren "%%i" "!FILENAME-TODAY!" 
04.
  if exist "%%i" do ( 
05.
    echo ... ERROR: rename "%%i" nicht erfolgreich >> !JOBLOG! 
06.
   goto :Error 
07.
   echo ... INFO: rename "%%i" "!FILENAME-TODAY!" >> !JOBLOG! 
08.
 
09.
   call :CHECKERRORLEVEL 
10.
 
11.
   goto :APPENDIDX 
12.
13.
14.
)
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
Bitte warten ..
Mitglied: bastla
13.08.2009 um 14:32 Uhr
@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:
01.
:CHECKTXTTODAY 
02.
if not exist "%FILENAME-TODAY%" ( 
03.
    for /f "delims=" %%i in ('dir /b /a-d "*.txt" 2^>nul') do ( 
04.
        ren "%%i" "%FILENAME-TODAY%" 
05.
        type "%%i">nul 2>nul && (echo ... ERROR: rename "%%i" nicht erfolgreich & goto :Error) 
06.
         
07.
        echo ... INFO: rename "%%i" "%FILENAME-TODAY%" 
08.
 
09.
        call :CHECKERRORLEVEL 
10.
 
11.
        goto :APPENDIDX 
12.
13.
)
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!"
Bitte warten ..
Mitglied: Jim-Knopf
13.08.2009 um 15:50 Uhr
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
Bitte warten ..
Mitglied: Jim-Knopf
13.08.2009 um 17:08 Uhr
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
Bitte warten ..
Mitglied: Jim-Knopf
13.08.2009 um 17:16 Uhr
Hi bastla

Ob Schlaufen oder Schliefen. Hauptsache immer im Kreis.
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
Bitte warten ..
Mitglied: bastla
13.08.2009 um 17:21 Uhr
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
Bitte warten ..
Mitglied: Jim-Knopf
13.08.2009 um 20:42 Uhr
Hi bastla

Ich bin schon ein wenig neidisch über all Dein Wissen.
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

Viele Grüsse
Jim
Bitte warten ..
Mitglied: Biber
14.08.2009 um 14:27 Uhr
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...

Grüße
Biber
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
C und C++
gelöst IF Abfrage funktioniert nicht mehr (2)

Frage von pablovic zum Thema C und C ...

Router & Routing
Transparenter Proxy funktioniert nicht? (1)

Frage von mrserious73 zum Thema Router & Routing ...

Linux
LTSP: PXE Boot funktioniert nicht (23)

Frage von Fenris14 zum Thema Linux ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...