If, else problem in For Schleife
Bin leider trotz Tante Google und Onkel Forum Suche noch keinen deut schlauer
Hallo zusammen,
ich versuche mich gearde an einem kleinen Batch Programm um lokal .pst Dateien zu suchen und auf ein Netzlaufwerk zu kopieren.
irgendwie habe ich aber einen Wurm mit rein gepackt und werd einfach nicht schlau.
Hier mal ein Stückchen Code
wenn das Script pst Dateien findet, ist alles ok, dann werden die Dateien (in meinem TestFall 2 Stück) auch angezeigt/kopiert und danach wird das echo "kopiert" ausgegeben.
Wenn jedoch keine pst Datei gefunden wird, passiert sekundenlang nichts, dann wird das echo kopieren ausgegeben.
Er soll aber doch in die Else Verzweigung rein springen.
Ich habe es glaube ich nicht richtig verstanden, kann es mir bitte jemand erklären?
Vielen Dank
Grüße
Hoffi
Hallo zusammen,
ich versuche mich gearde an einem kleinen Batch Programm um lokal .pst Dateien zu suchen und auf ein Netzlaufwerk zu kopieren.
irgendwie habe ich aber einen Wurm mit rein gepackt und werd einfach nicht schlau.
Hier mal ein Stückchen Code
@echo off
set dir=c:\
set file=*.pst
set pfad=K:\Mailarchiv
for /r "%dir%" %%i in ("%file%") do (if exist "%%i" (echo xcopy "%%i" %pfad%) else (goto fehler))
echo kopiert
pause
exit
:fehler
echo kein Archiv
pause
exit
wenn das Script pst Dateien findet, ist alles ok, dann werden die Dateien (in meinem TestFall 2 Stück) auch angezeigt/kopiert und danach wird das echo "kopiert" ausgegeben.
Wenn jedoch keine pst Datei gefunden wird, passiert sekundenlang nichts, dann wird das echo kopieren ausgegeben.
Er soll aber doch in die Else Verzweigung rein springen.
Ich habe es glaube ich nicht richtig verstanden, kann es mir bitte jemand erklären?
Vielen Dank
Grüße
Hoffi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 163892
Url: https://administrator.de/contentid/163892
Ausgedruckt am: 23.11.2024 um 03:11 Uhr
26 Kommentare
Neuester Kommentar
moin,
ist bei Problembätchen immer der Sinnvollste Weg, nicht auf das Problem zu kommen....
Gruß
01. @echo off
ist bei Problembätchen immer der Sinnvollste Weg, nicht auf das Problem zu kommen....
for /r "%dir%" %%i in ("%file%") do if exist "%%i"
- bedeutet doch - für jeden Treffer mache - wenn Treffer existiert..
- also auf neudeutsch doppelt gemoppelt
for /r "%dir%" %%i in ("%file%") do echo xcopy "%%i" %pfad% && goto ready
echo fehler
:ready
echo fehler
:ready
- Was wäre denn der Unterschied zu dem oben skizziertem Weg (außer das der funktioniert?)
Gruß
Zitat von @60730:
- Was wäre denn der Unterschied zu dem oben skizziertem Weg (außer das der funktioniert?)
Aloha T-Mo,
ganz einfach: Der wäre zu einfach, Montags muss es aber kompliziert sein
greetz André
edit: Warum kann man eigentlich
if "%1" == "" echo leer
aber nicht if "%%i" == "" echo leer
machen ... *grübel* - Die Schleife arbeitet wohl nicht weiter, wenn %%i
leer ist, schade eigentlich ^_^
Aloha,
Mahlzeit, André..
@echo off & setlocal
set dir=C:\
set file=*.pst
set pfad=K:\Mailarchiv
set "Z="
for /r "%dir%" %%i in ("%file%") do call :Ablauf "%%i"
if not defined Z goto :fehler
echo kopiert
pause
goto :eof
:Ablauf
set "Z=%1"
echo xcopy %Z% "%pfad%"
goto :eof
:fehler
echo fehler
pause
goto :eof
Mahlzeit, André..
Aloha,
ich versteh deine Logik nicht, habe meinen code oben jetzt gepostet - sollte doch so mehr als ausreichend sein oder nicht?
Du versuchst zu prüfen ob leer nicht existiert, was keinen Sinn macht, da leer gar nicht erst übergeben werden kann.
Oder anders gesagt:
... die Schleife nimmt nur existierende Dateien auf ... warum willst du prüfen, ob eine existierende Datei existiert oder nicht?
greetz André
ich versteh deine Logik nicht, habe meinen code oben jetzt gepostet - sollte doch so mehr als ausreichend sein oder nicht?
Du versuchst zu prüfen ob leer nicht existiert, was keinen Sinn macht, da leer gar nicht erst übergeben werden kann.
Oder anders gesagt:
... die Schleife nimmt nur existierende Dateien auf ... warum willst du prüfen, ob eine existierende Datei existiert oder nicht?
greetz André
moin.........
Übersetze
das doch bitte mal.......
for /r "%dir%" %%i in ("%file%") do if "%%i" == "" goto fehler
echo xcopy "%%i" %pfad%
echo fertig kopiert
pause
exit
Übersetze
das doch bitte mal.......
Hier springt er NICHT in die Sprungmarke fehler.....
- für jeden Treffer, der sich aus pfad und suffix zusammensetzt - wenn dieser "" lautet - gehe zu Fehler?
DENKFEHLER
Nee, Dein Code klappt in sofern, das bei Nichtvorhandensein nun in die Sprungmarke gesprungen wird und bei Vorhandensein, führt er den kopierbefehl genau einmal aus.
NEIN
Ich werd wahnsinnig face-sad
Dann zieh mich da aber bitte nicht mit rein.Zitat von @Skyemugen:
Aloha,
ich versteh deine Logik nicht, habe meinen code oben jetzt gepostet - sollte doch so mehr als ausreichend sein oder nicht?
Du versuchst zu prüfen ob leer nicht existiert, was keinen Sinn macht, da leer gar nicht erst übergeben werden
kann.
Oder anders gesagt:
... die Schleife nimmt nur existierende Dateien auf ... warum willst du prüfen, ob eine existierende Datei existiert oder
nicht?
Aloha,
ich versteh deine Logik nicht, habe meinen code oben jetzt gepostet - sollte doch so mehr als ausreichend sein oder nicht?
Du versuchst zu prüfen ob leer nicht existiert, was keinen Sinn macht, da leer gar nicht erst übergeben werden
kann.
Oder anders gesagt:
... die Schleife nimmt nur existierende Dateien auf ... warum willst du prüfen, ob eine existierende Datei existiert oder
nicht?
[OT]
wie oft hatten wir das Thema denn schon
"Ich "sichere" eine pst Datei und kümmere mich nicht darum, das Ausguck diese hoffentlich in dem Moment auch nicht benutzt?
mindestens 2*.....
[/OT]
greetz André
retour
Zitat von @Hoffi:
Hallo,
ich habe Timos Code ausgeführt.
Es wird nur 1 Datei kopiert, es gibt aber 2 Dateien.
Nein - es wird garnix kopiert - nur ein echo....Hallo,
ich habe Timos Code ausgeführt.
Es wird nur 1 Datei kopiert, es gibt aber 2 Dateien.
Die For Schleife muss doch so lange durchlaufen werden, wie es Dateien gibt, oder?
- dafür wurden die gemacht
Beim ersten Durchlauf ...
Vielen Dank für Eure Geduld aber ich glaub ich steh mächtig auf dem Schlauch....
bitte mach das echo off raus - nimm ne leere DOSBOX und lasse das laufen!
Grüße
Hoffi
@echo off
set dir=c:\
set file=*.pst
set pfad=K:\Mailarchiv
dir /B "%dir%"\%file% >NUL 2>NUL || goto:fehler
for /r "%dir%" %%i in ("%file%") do echo xcopy "%%i" %pfad%
echo kopiert
pause
exit
:fehler
echo kein Archiv
pause
exit
@echo off
set dir=c:\
set file=*.pst
set pfad=K:\Mailarchiv
xcopy "%dir%"\%file% %pfad%
if %errorlevel% equ 1 echo kein Archiv
if %errorlevel% equ 0 echo kopiert
pause
exit
Hallo,
Jepp
Wo hast du denn jetzt schon wieder das && hergeholt? Gabs das umsonst?
Gruß,
Peter
Jepp
@echo off IST aus, Ausgabe in Dos Box sieht gut aus, kopiert wird trotzdem nur 1 Datei.
for /r "%dir%" %%i in ("%file%") do xcopy /E "%%i" %pfad% && goto :Fertig
Dieser Code funktioniert bestens, wenn es 1 Datei gibt, bei 2 Dateien wird nur die erste kopiert !
Klar.das Suchen funktioniert, das kopieren leider nur bei einer Datei.
Weder noch.Gruß,
Peter
Hallo Hoffi!
Wenn ich das richtig verstehe und die Fehlermeldung nur ausgegeben werden soll, wenn keine einzige Datei gefunden wurde, sollte das (ungetestet) etwa so gehen:
BTW: Ein "
Grüße
bastla
Wenn ich das richtig verstehe und die Fehlermeldung nur ausgegeben werden soll, wenn keine einzige Datei gefunden wurde, sollte das (ungetestet) etwa so gehen:
@echo off
set dir=c:\
set file=*.pst
set pfad=K:\Mailarchiv
set "Gefunden="
for /r "%dir%" %%i in ("%file%") do echo xcopy "%%i" %pfad% & set "Gefunden=True"
if not defined Gefunden goto :fehler
echo kopiert
pause
goto :eof
:fehler
echo kein Archiv
pause
goto :eof
exit
" ohne "/b
" ist mE sinnlos ...Grüße
bastla
moin,
ich nehm nix zurück - aber einen notwendigen klammersatz spendiere ich
nein - wenn das kopieren, oder genauer - das anzeigen der kopieraktion erfolgreich war - dann springe zu ready - daher einen () drumherum.
Diesen Code hatte Timo eingestellt.
und dabei die klammern um den do Teil verschlampert....
Es soll die Platte C nach .pst dateien durchsucht werden und ALLE .pst dateien zum Pfad kopiert werden,
yupp
Grüße
Hoffi
ich nehm nix zurück - aber einen notwendigen klammersatz spendiere ich
das Suchen funktioniert, das kopieren leider nur bei einer Datei.
nein - wenn das kopieren, oder genauer - das anzeigen der kopieraktion erfolgreich war - dann springe zu ready - daher einen () drumherum.
for /r "%dir%" %%i in ("%file%") do (echo xcopy "%%i" %pfad%) && goto ready
echo fehler
:ready
Diesen Code hatte Timo eingestellt.
Es soll die Platte C nach .pst dateien durchsucht werden und ALLE .pst dateien zum Pfad kopiert werden,
DANACH wenn alles kopiert ist, soll eine Meldung ausgegeben werden.
Wenn keine .pst Datei gefunden wird, soll eine Meldung ausgegeben werden und das Script beendet.
Wenn keine .pst Datei gefunden wird, soll eine Meldung ausgegeben werden und das Script beendet.
- Wie geschrieben - denk dran, dass pst ruckzuck in den Orkus fliegen, wenn Outlook geöffnet ist und man da was dran rumstrickt....
Grüße
Hoffi
Hallo Hoffi und T-Mo!
Natürlich wird nur eine Datei kopiert, da ja danach gleich die Schleife verlassen wird - daher wenn schon Klammern, dann am ehesten noch so (weitestgehend ungetestet):
[Edit] Nach einem kurzen Test würde ich sagen, der Errorlevel hängt davon ab, ob im letzten durchsuchten Ordner eine passende Datei gefunden wurde - daher wird das auch so nicht gehen ... [/Edit]
Grüße
bastla
Natürlich wird nur eine Datei kopiert, da ja danach gleich die Schleife verlassen wird - daher wenn schon Klammern, dann am ehesten noch so (weitestgehend ungetestet):
(for /r "%dir%" %%i in ("%file%") do echo xcopy "%%i" %pfad%) && goto ready
Grüße
bastla