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, else problem in For Schleife

Frage Entwicklung Batch & Shell

Mitglied: Hoffi

Hoffi (Level 1) - Jetzt verbinden

04.04.2011, aktualisiert 18.10.2012, 5485 Aufrufe, 26 Kommentare

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

01.
@echo off 
02.
set dir=c:\ 
03.
set file=*.pst 
04.
set pfad=K:\Mailarchiv 
05.
 
06.
for /r "%dir%" %%i in ("%file%") do (if exist "%%i" (echo xcopy "%%i" %pfad%) else (goto fehler))            
07.
echo kopiert 
08.
pause 
09.
exit 
10.
 
11.
:fehler 
12.
echo kein Archiv 
13.
pause 
14.
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
Mitglied: Skyemugen
04.04.2011 um 11:19 Uhr
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
Bitte warten ..
Mitglied: Hoffi
04.04.2011 um 11:26 Uhr
Hallo,

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

Habe aus der Endung zum testen .pts gemacht.

01.
@echo off 
02.
set dir=c:\ 
03.
set file=*.pts 
04.
set pfad=K:\Mailarchiv 
05.
 
06.
for /r "%dir%" %%i in ("%file%") do if exist "%%i" (echo xcopy "%%i" %pfad%) else (goto :fehler)             
07.
echo kopiert 
08.
pause 
09.
exit 
10.
 
11.
:fehler 
12.
echo kein Archiv 
13.
pause 
14.
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
Bitte warten ..
Mitglied: Skyemugen
04.04.2011 um 11:31 Uhr
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é
Bitte warten ..
Mitglied: 60730
04.04.2011 um 11:42 Uhr
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ß
Bitte warten ..
Mitglied: Skyemugen
04.04.2011 um 11:46 Uhr
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 ^_^
Bitte warten ..
Mitglied: Hoffi
04.04.2011 um 12:20 Uhr
Hallo,

das ist zu einfach

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
Bitte warten ..
Mitglied: Hoffi
04.04.2011 um 12:24 Uhr
Hi,

HiHi, Wink -> Zaunpfahl

aber auch das habe ich schon probiert:

01.
for /r "%dir%" %%i in ("%file%") do if "%%i" == "" goto fehler 
02.
echo xcopy "%%i" %pfad% 
03.
echo fertig kopiert 
04.
pause 
05.
exit
Hier springt er NICHT in die Sprungmarke fehler.....
Bitte warten ..
Mitglied: Skyemugen
04.04.2011 um 12:36 Uhr
Aloha,

01.
@echo off & setlocal 
02.
set dir=C:\ 
03.
set file=*.pst 
04.
set pfad=K:\Mailarchiv 
05.
set "Z=" 
06.
 
07.
for /r "%dir%" %%i in ("%file%") do call :Ablauf "%%i" 
08.
if not defined Z goto :fehler 
09.
echo kopiert 
10.
pause 
11.
goto :eof 
12.
 
13.
:Ablauf 
14.
set "Z=%1" 
15.
echo xcopy %Z% "%pfad%" 
16.
goto :eof 
17.
 
18.
:fehler 
19.
echo fehler 
20.
pause 
21.
goto :eof
Mahlzeit, André..
Bitte warten ..
Mitglied: Hoffi
04.04.2011 um 12:46 Uhr
Hallo,

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

01.
set dir=c:\ 
02.
set file=*.pts 
03.
set pfad=K:\Mailarchiv 
04.
 
05.
for /r "%dir%" %%i in ("%file%") do call :archiv "%%i" 
06.
echo "%%i" 
07.
echo fertig 
08.
pause 
09.
exit 
10.
 
11.
:fehler 
12.
echo kein Archiv 
13.
pause 
14.
exit 
15.
 
16.
:archiv 
17.
if not exist %1 goto fehler 
18.
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)
Bitte warten ..
Mitglied: Skyemugen
04.04.2011 um 12:53 Uhr
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é
Bitte warten ..
Mitglied: 60730
04.04.2011 um 13:08 Uhr
moin.........
Zitat von Hoffi:
Hi,

HiHi, Wink -> Zaunpfahl

aber auch das habe ich schon probiert:

01.
for /r "%dir%" %%i in ("%file%") do if "%%i" == "" goto fehler 
02.
echo xcopy "%%i" %pfad% 
03.
echo fertig kopiert 
04.
pause 
05.
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.
Bitte warten ..
Mitglied: Hoffi
04.04.2011 um 13:09 Uhr
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
Bitte warten ..
Mitglied: 60730
04.04.2011 um 13:10 Uhr
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
Bitte warten ..
Mitglied: 60730
04.04.2011, aktualisiert 18.10.2012
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!!!!!!!!!!!!!!!!!!!!!!!!!!
http://www.administrator.de/wissen/%28at%29echo-off-oder-batch4runaways ...

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

Bitte warten ..
Mitglied: Skyemugen
04.04.2011 um 13:16 Uhr
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é
Bitte warten ..
Mitglied: miniversum
04.04.2011 um 13:27 Uhr
01.
@echo off 
02.
set dir=c:\ 
03.
set file=*.pst 
04.
set pfad=K:\Mailarchiv 
05.
 
06.
dir /B "%dir%"\%file% >NUL 2>NUL || goto:fehler 
07.
for /r "%dir%" %%i in ("%file%") do echo xcopy "%%i" %pfad%            
08.
echo kopiert 
09.
pause 
10.
exit 
11.
 
12.
:fehler 
13.
echo kein Archiv 
14.
pause 
15.
exit
oder nur:
01.
@echo off 
02.
set dir=c:\ 
03.
set file=*.pst 
04.
set pfad=K:\Mailarchiv 
05.
 
06.
xcopy "%dir%"\%file% %pfad% 
07.
if %errorlevel% equ 1 echo kein Archiv 
08.
if %errorlevel% equ 0 echo kopiert 
09.
pause 
10.
exit
Bitte warten ..
Mitglied: Hoffi
04.04.2011 um 14:00 Uhr
Hallo,

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

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

01.
set dir=C:\ 
02.
set file=*.pst 
03.
set pfad=K:\Mailarchiv 
04.
 
05.
for /r "%dir%" %%i in ("%file%") do xcopy /E "%%i" %pfad%  && goto :Fertig 
06.
echo Fehler 
07.
pause 
08.
exit 
09.
 
10.
 
11.
:Fertig 
12.
echo fertig 
13.
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
Bitte warten ..
Mitglied: Hoffi
04.04.2011 um 14:02 Uhr
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
Bitte warten ..
Mitglied: Pjordorf
04.04.2011 um 14:20 Uhr
Hallo,

Zitat von Hoffi:
ich weis, wer den Schaden hat......
Jepp

@echo off IST aus, Ausgabe in Dos Box sieht gut aus, kopiert wird trotzdem nur 1 Datei.
01.
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
Bitte warten ..
Mitglied: Hoffi
04.04.2011 um 14:26 Uhr
Hallo Peter,

01.
for /r "%dir%" %%i in ("%file%") do echo xcopy "%%i" %pfad% && goto ready 
02.
echo fehler 
03.
: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
Bitte warten ..
Mitglied: bastla
04.04.2011 um 14:31 Uhr
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:
01.
@echo off 
02.
set dir=c:\ 
03.
set file=*.pst 
04.
set pfad=K:\Mailarchiv 
05.
 
06.
set "Gefunden=" 
07.
for /r "%dir%" %%i in ("%file%") do echo xcopy "%%i" %pfad% & set "Gefunden=True"            
08.
if not defined Gefunden goto :fehler 
09.
echo kopiert 
10.
pause 
11.
goto :eof 
12.
 
13.
:fehler 
14.
echo kein Archiv 
15.
pause 
16.
goto :eof
BTW: Ein "exit" ohne "/b" ist mE sinnlos ...

Grüße
bastla
Bitte warten ..
Mitglied: 60730
04.04.2011 um 14:32 Uhr
moin,

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

01.
for /r "%dir%" %%i in ("%file%") do (echo xcopy "%%i" %pfad%) && goto ready 
02.
echo fehler 
03.
: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

Bitte warten ..
Mitglied: Hoffi
04.04.2011 um 14:33 Uhr
Hallo,

Genau.

Vielen Dank,

es funktioniert.

Grüße

Hoffi
Bitte warten ..
Mitglied: Skyemugen
04.04.2011 um 14:55 Uhr
... ich sag dazu jetzt nichts scheiß 30 Zeichen
Bitte warten ..
Mitglied: Hoffi
04.04.2011 um 15:30 Uhr
Hallo Timo,

Du wirst mich wahrscheinlich gleich lünchen

Dein Code:
01.
@echo off 
02.
set dir=c:\ 
03.
set file=*.pst 
04.
set pfad=K:\Mailarchiv 
05.
 
06.
for /r "%dir%" %%i in ("%file%") do (echo xcopy "%%i" %pfad%) && goto ready 
07.
echo fehler 
08.
pause 
09.
:ready 
10.
echo passt 
11.
pause
ergibt folgende Ausgabe:

01.
xcopy "c:\Test_PST\PST_1.pst" K:\Mailarchiv 
02.
passt 
03.
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
Bitte warten ..
Mitglied: bastla
04.04.2011 um 15:47 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch Problem bei einer For Schleife (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Multimedia & Zubehör
BENQ Beamer Fernbedingung Frequenz Problem (2)

Frage von xbast1x zum Thema Multimedia & Zubehör ...

Windows Server
Google Chrome Web Store Problem auf Terminal Farm

Frage von dakoerry zum Thema Windows Server ...

Multimedia & Zubehör
gelöst Problem: DVI zu VGA (8)

Frage von Protected zum Thema Multimedia & Zubehör ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Router & Routing
gelöst Empfehlung günstiges ADSL2+ nur Modem (10)

Frage von TimMayer zum Thema Router & Routing ...

Server-Hardware
Lenovo Server System X 3650 M5 Festplatten (9)

Frage von Hendrik2586 zum Thema Server-Hardware ...