hoffi
Goto Top

If, else problem in For Schleife

Bin leider trotz Tante Google und Onkel Forum Suche noch keinen deut schlauer face-sad

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

Content-ID: 163892

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

Ausgedruckt am: 14.11.2024 um 01:11 Uhr

Skyemugen
Skyemugen 04.04.2011 um 11:19:23 Uhr
Goto Top
Aloha,

nimm doch mal die Klammer vor if exist und nach fehler) weg.

greetz André

edit: Ach, mal wieder nur halb gelesen (Montags ...) das eigentliche Problem wird so ja nicht behoben
Hoffi
Hoffi 04.04.2011 um 11:26:10 Uhr
Goto Top
Hallo,

Hmm, ist immernoch das selbe, er springt NICHT in den Else Zweig.

Habe aus der Endung zum testen .pts gemacht.

@echo off
set dir=c:\
set file=*.pts
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

es passiert 5 Sekunden nichts, dann kommt die Bildschirmausgabe "kopiert"

es gibt definitiv keine Dateien mit .pts, also müsste er doch in den Else Zweig springen ????

Ich raffs nicht, sorry

Grüße

Hoffi
Skyemugen
Skyemugen 04.04.2011 um 11:31:32 Uhr
Goto Top
Aloha,

ja, heute ist Montag, da bin ich noch nicht wach *gg*

Es gibt kein else bei if exist ... und ob %%i nicht existen kann ... glaube ein if not defined müsste machbarer sein. (wobei das ginge ja nur, wenn eine Variable gesetzt ist ... heute ist wirklich Montag).

greetz André
60730
60730 04.04.2011 um 11:42:53 Uhr
Goto Top
moin,

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

  • Was wäre denn der Unterschied zu dem oben skizziertem Weg (außer das der funktioniert?)

Gruß
Skyemugen
Skyemugen 04.04.2011 um 11:46:13 Uhr
Goto Top
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 face-wink

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 ^_^
Hoffi
Hoffi 04.04.2011 um 12:20:59 Uhr
Goto Top
Hallo,

das ist zu einfach face-smile

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.

Es gibt aber zwei dateien, also müsste er auch 2 mal kopieren, oder?

Wie komme ich also aus der Sprungmarke wieder zurück mit Call ??

dann würde er doch den Rest der For Schleife abarbeiten, also echo fehler anzeigen ???

Ich werd wahnsinnig face-sad
Hoffi
Hoffi 04.04.2011 um 12:24:41 Uhr
Goto Top
Hi,

HiHi, Wink -> Zaunpfahl

aber auch das habe ich schon probiert:

for /r "%dir%" %%i in ("%file%") do if "%%i" == "" goto fehler  
echo xcopy "%%i" %pfad%  
echo fertig kopiert
pause
exit

Hier springt er NICHT in die Sprungmarke fehler.....
Skyemugen
Skyemugen 04.04.2011 um 12:36:58 Uhr
Goto Top
Aloha,

@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é..
Hoffi
Hoffi 04.04.2011 um 12:46:01 Uhr
Goto Top
Hallo,

auch das auslagern der If Abfrage und Aufruf über Call funktioniert nicht:

set dir=c:\
set file=*.pts
set pfad=K:\Mailarchiv

for /r "%dir%" %%i in ("%file%") do call :archiv "%%i"  
echo "%%i"  
echo fertig
pause
exit

:fehler
echo kein Archiv
pause
exit

:archiv
if not exist %1 goto fehler
if exist %1 echo xcopy %1 %Pafd%

Wenn pst Dateien vorhanden sind, will er sie kopieren, kein Thema, aber wenn die nicht vorhanden sind, arbeitet er einfach die rets Befehle ab (echo "%%i" und echo fertig, pause, exit)
Skyemugen
Skyemugen 04.04.2011 um 12:53:13 Uhr
Goto Top
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é
60730
60730 04.04.2011 um 13:08:23 Uhr
Goto Top
moin......... face-sad
Zitat von @Hoffi:
Hi,

HiHi, Wink -> Zaunpfahl

aber auch das habe ich schon probiert:

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?

back-to-topDENKFEHLER


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.

back-to-topNEIN

Ich werd wahnsinnig face-sad
Dann zieh mich da aber bitte nicht mit rein.
Hoffi
Hoffi 04.04.2011 um 13:09:07 Uhr
Goto Top
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?

Beim ersten Durchlauf springt er in die Sprungmarke, dort könnte ich ein echo ausgeben, aber was passiert mit der 2. Datei, oder vielleicht gibt es auch 3 oder 4 Dateien?

Wie komme ich denn wieder zurück in die For schleife, sodass er alle gefundenen Dateien kopiert und DANN ein Fertig ausgibt.

Wenn er keine Datei findet, soll er einen Fehler ausgeben und beenden

Vielen Dank für Eure Geduld aber ich glaub ich steh mächtig auf dem Schlauch....

Grüße

Hoffi
60730
60730 04.04.2011 um 13:10:05 Uhr
Goto Top
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?

[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
60730
60730 04.04.2011, aktualisiert am 18.10.2012 um 18:46:20 Uhr
Goto Top
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....

Die For Schleife muss doch so lange durchlaufen werden, wie es Dateien gibt, oder?
  • dafür wurden die gemacht


Beim ersten Durchlauf ...
LESE DAS!!!!!!!!!!!!!!!!!!!!!!!!!!


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


Skyemugen
Skyemugen 04.04.2011 um 13:16:14 Uhr
Goto Top
Aloha T-Mo,

[OT]
na dafür können wir ihm ja einen knallharten
set OL=outlook.exe
tasklist |find /i "%OL%" >nul
if %errorlevel% == 0 taskkill /IM %OL% /F /T
schenken, der bei falscher Anwendung zu Datenverlust führen kann *gg*
[/OT]

greetz André
miniversum
miniversum 04.04.2011 um 13:27:10 Uhr
Goto Top
@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
oder nur:
@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
Hoffi
Hoffi 04.04.2011 um 14:00:30 Uhr
Goto Top
Hallo,

ich weis, wer den Schaden hat......

@echo off IST aus, Ausgabe in Dos Box sieht gut aus, kopiert wird trotzdem nur 1 Datei.

set dir=C:\
set file=*.pst
set pfad=K:\Mailarchiv

for /r "%dir%" %%i in ("%file%") do xcopy /E "%%i" %pfad%  && goto :Fertig  
echo Fehler
pause
exit


:Fertig
echo fertig
goto :eof

Dieser Code funktioniert bestens, wenn es 1 Datei gibt, bei 2 Dateien wird nur die erste kopiert !

@miniversum

Hallo,

Danke für Deinen Code...

da ich den genauen Pfad und Namen der Datei im Vorfeld nicht kenne (das Script soll auf User PC laufen) muss ich erst alle .pst Dateien suchen und dann nach einander kopieren.

das Suchen funktioniert, das kopieren leider nur bei einer Datei.

Vielen Dank

Gruß

Hoffi
Hoffi
Hoffi 04.04.2011 um 14:02:42 Uhr
Goto Top
Hallo,

Diese und andere eventualitäten habe ich bereits abgefangen !!

Mir geht es nur um diese bescheuerte For Schleife, die IMMER nur einmal ausgeführt wird !

Danke
Pjordorf
Pjordorf 04.04.2011 um 14:20:16 Uhr
Goto Top
Hallo,

Zitat von @Hoffi:
ich weis, wer den Schaden hat......
Jeppface-smile

@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  
Wo hast du denn jetzt schon wieder das && hergeholt? Gabs das umsonst?

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
Hoffi
Hoffi 04.04.2011 um 14:26:00 Uhr
Goto Top
Hallo Peter,

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.

Grüße

Hoffi
bastla
bastla 04.04.2011 um 14:31:22 Uhr
Goto Top
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:
@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
BTW: Ein "exit" ohne "/b" ist mE sinnlos ...

Grüße
bastla
60730
60730 04.04.2011 um 14:32:42 Uhr
Goto Top
moin,

ich nehm nix zurück - aber einen notwendigen klammersatz spendiere ich face-wink

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.
Zitat von @Hoffi:
Hallo Peter,

for /r "%dir%" %%i in ("%file%") do (echo xcopy "%%i" %pfad%) && goto ready  
echo fehler
:ready

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
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.

  • 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


Hoffi
Hoffi 04.04.2011 um 14:33:49 Uhr
Goto Top
Hallo,

Genau.

Vielen Dank,

es funktioniert.

Grüße

Hoffi
Skyemugen
Skyemugen 04.04.2011 um 14:55:30 Uhr
Goto Top
... ich sag dazu jetzt nichts ### 30 Zeichen
Hoffi
Hoffi 04.04.2011 um 15:30:58 Uhr
Goto Top
Hallo Timo,

Du wirst mich wahrscheinlich gleich lünchen

Dein Code:
@echo off
set dir=c:\
set file=*.pst
set pfad=K:\Mailarchiv

for /r "%dir%" %%i in ("%file%") do (echo xcopy "%%i" %pfad%) && goto ready  
echo fehler
pause
:ready
echo passt
pause

ergibt folgende Ausgabe:

xcopy "c:\Test_PST\PST_1.pst" K:\Mailarchiv  
passt
Drücken Sie eine beliebige Taste . . .

es gibt aber 2 Dateien PST_1 und PST_2 es wird aber nur 1 Datei "optisch" kopiert (echo)

und nun?

Grüße

Hoffi
bastla
bastla 04.04.2011 um 15:47:46 Uhr
Goto Top
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):
(for /r "%dir%" %%i in ("%file%") do echo xcopy "%%i" %pfad%) && goto ready
[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