chris0815
Goto Top

Batch FOR-Schleife Dateien vergleichen und drucken

Hallo liebe Gemeinde von administrator.de.

Habe mich hier angemeldet, da ich der Meinung bin, hier die Hilfe für mein Problem zu erhalten.
Ich habe nun seit mehreren Tagen dieses Forum durchsucht, Google befragt und gelesen ohne Ende.

Jedoch verstehe ich nicht immer alles, was ich direkt machen soll.

So, nun zu meinem Problem.

// EDIT: Sorry, hatte Formatierung glatt vergessen. Bitte um Entschuldigung

OS: WinXP
Scriptart: Batch

Situationsdarstellung:

Wir erhalten über einen FTP-Server theoretisch täglich neue Daten (DAT-Dateien).
Dort enthalten sind Barcodes, welche wir ausdrucken möchten/sollen.

Ich habe nun ein Batch-Script geschrieben, welches sich auf den FTP verbindet, die DAT-Dateien automatisch herunterlädt und dann Fragen stellt, was gemacht werden soll.

Hier der Auszug aus dem Batch-Script:

@echo off
cls
echo.
echo.
echo ##################################################
echo ## Moechten Sie die Daten jetzt herunterladen ? ##
echo ##						##
echo ##        Druecken Sie J/N und dann ENTER       ##
echo ##################################################
echo.
echo #################################################
echo ## Dieser Vorgang kann bis zu 5 Minuten dauern ##
echo ##					       ##
echo ##        Bitte haben Sie etwas Geduld.        ##
echo #################################################
echo.
echo.
SET /p auswahl=
if %auswahl%==j goto yes1
if %auswahl%==n goto no1

:no1
goto kopieren

:yes1
echo.
echo ###########################
echo ## Starte FTP-Verbindung ##
echo ###########################
echo.
echo.
ftp -s:conn.ect 


// hier der Auszug aus der conn.ect-Datei:

OPEN IP-ADRESSE
Benutzername
Passwort
lcd "X:\lokaler_Ordner\"  
cd /order/auf/ftp
binary
mget *.dat
y
y
close
quit

// Ende Auszug conn.ect-Datei

echo.
echo.
echo ######################
echo ## Download beendet ##
echo ######################
echo.
echo.

REM echo #######################################
REM echo ## Prüfe auf Vorhandensein der Daten ##
REM echo #######################################

// hier ist jetzt mein Problem (Problemdarstellung siehe unten)

:kopieren
echo.
echo.
echo ################################################
echo ##  Moechten Sie die Auftraege verschieben ?  ##
echo ##					      ##
echo ##      Druecken Sie J/N und dann ENTER       ##
echo ################################################
echo.
echo.
SET /p auswahl=
if '%auswahl%'=='j' goto yes3  
if '%auswahl%'=='n' goto no3  

:no3
goto printing

:yes3
echo.
echo.
xcopy X:\auftraege\2011\gedruckt /-Y
// Befehl erstmal dafür da, dass man sieht, ob Dateien schon vorhanden (Notlösung)


ping -n 4 127.0.0.1 >nul


:printing
echo.
echo #############################################
echo ##       Moechten Sie jetzt drucken ?      ##
echo ##					   ##
echo ##  !!! BITTE WEISSES PAPIER EINLEGEN !!!  ##
echo ##					   ##
echo ##     Druecken Sie J/N und dann ENTER     ##
echo #############################################
echo.
echo.
SET /p auswahl=
if '%auswahl%'=='j' goto yes2  
if '%auswahl%'=='n' goto no2  

:no2
goto loeschen

:yes2
PRINT /D:"\\ServerName\DruckerName" *.dat  


echo.
echo.
echo #################################################
echo ## Druecken Sie eine beliebige Taste, wenn der ##
echo ##  Druckvorgang beendet ist, um fortzufahren  ##
echo #################################################
echo.
echo.

pause


:loeschen
echo.
echo.
echo #################################################
echo ##  Moechten Sie die Auftraege nun loeschen ?  ##
echo ##					       ##
echo ##      Druecken Sie J/N und dann ENTER        ##
echo #################################################
echo.
echo.

SET /p auswahl=
if '%auswahl%'=='j' goto yes4  
if '%auswahl%'=='n' goto no4  

:no4
goto beenden

:yes4
cd /D "X:\auftraege\2011"  
del *.dat

:beenden
echo.
echo.
echo #################################################
echo ##  Druecken Sie eine beliebige Taste, um das  ##
echo ##	      Programm zu beenden.             ##
echo #################################################
pause
exit


Kurze Script-Erklärung:

FTP-Verbindung herstellen -> Daten runterladen -> in Ordner X:\auftraege\2011\ speichern -> kopieren in Ordner X:\auftraege\2011\gedruckt um zu schauen, ob Daten schon vorhanden -> DAT-Dateien ausdrucken -> DAT-Dateien aus Ordner X:\auftraege\2011 löschen -> Programm beenden.


Nun zur Problemdarstellung:

Mein Problem ist nun, dass dieses Script natürlich alle DAT-Dateien drucken würde und zwar auch die, welche schon gedruckt wurden.

Mein Lösungsansatz war die FOR-Schleife und genau da harpert es bei mir.
Ich habe mir die Anleitung hier auf der Seite durchgelesen -> nicht wirklich verstanden, mehrere andere FOR-Schleifen-Tutorials gelesen -> nicht wirklich verstanden, mit dem Befehl FC probiert -> ist nicht die Lösung -> robocopy angeschaut -> ist nicht die Lösung.

Die Lösung ist zwar eine FOR-Schleife, nur ich bin wirklich etwas dämlich in dieser Beziehung (Delims, Tokens usw. = Böhmische Dörfer)
(Die Hilfe für FOR habe ich ebenfalls gelesen, aber ich bin programmiertechnisch (Script-Technisch) einfach dämlich, gebe ich auch offen zu)
Das ich das Script oben zusammenbekommen habe liegt auch nur an Google und Co. sowie probieren usw.

Die DAT-Dateien haben ein gewisses Muster: FZ_FIRMA_DATUM.LaufendeNummer.dat

Das Datum wird im Format YYYYMMDD dargestellt, bsp. 20110505.
Der Punkt dahinter ist auch nicht zu vergessen.


Meine Frage ist eigentlich nun folgende:

Das Script soll natürlich die Dateien downloaden in Ordner X:\auftraege\2011, prüfen ob bereits vorhanden in Ordner X:\auftraege\2011\gedruckt, wenn vorhanden -> Ur-Datei aus Ordner X:\auftraege\2011 löschen, wenn nicht vorhanden drucken, verschieben in Ordner X:\auftraege\2011\gedruckt und Urdatei in Ordner X:\auftraege\2011 löschen.

Das Einzige was das Script noch nicht macht, ist die Prüfung an sich und den dann weiteren Verlauf.

Das kann eigentlich nicht so schwer sein, aber irgendwie will das nicht in meinen Kopf.

Bitte auch nicht mit GUI-FTP-Programmen kommen. Hintergrund ist, die Mitarbeiterin soll auf einen Knopf drücken, höchstens mal noch 2-3 mal "J" drücken und fertig sein.


Ich würde mich über eine Antwort, mit entsprechendem Lösungsvorschlag sehr freuen.
Ansonsten kann mir auch gern jemand versuchen zu erklären, was es mit der FOR-Schleife (FOR /F usw.) wirklich auf sich hat, nur hier muss es wirklich für Babys erklärt sein.
Also das selbst ein 3-jähriger Mensch das verstehen würde.

Vielen Dank im Voraus und habt bitte etwas Verständnis für meine Minderbemitteltheit.

Content-ID: 165879

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

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

Skyemugen
Skyemugen 09.05.2011 um 10:06:35 Uhr
Goto Top
Aloha,

bevor ich deinen EP weiterlese, tu uns allen bitte einen notwendigen Gefallen:
nutze die Codeformatierung
siehe

danke, danach lese ich dann auch gerne den Rest weiter.

greetz André

P.S.: An dem Code lässt sich auf jeden Fall noch vieles Optimieren ;)

edit ah, Formatierung, na gleich mal durchlesen, was er denn von uns mag ^_^

Du kannst auf jeden Fall schon einmal die Hälfte vom „Spring-ins-Nichts”-goto weglassen, indem du
if %auswahl%==j (goto yes1) else (goto kopieren)
verwendest [und das angepasst bei den jeweiligen Optionen]
Skyemugen
Skyemugen 09.05.2011 um 12:49:39 Uhr
Goto Top
Aloha,

hm, wer kopiert denn, um dann nicht zu drucken? Die Dateien gehören nicht in den Ordner gedruckt, wenn sie nicht gedruckt wurden, ergo würde ich folgendes tun:

for /f "delims=" %%a in ('xcopy "X:\auftraege\2011\*.dat" "X:\auftraege\2011\gedruckt" /D') do PRINT /D:"\\ServerName\DruckerName" "%%a"

greetz André

P.S.: Dieses Codegemale ist der reinste Horror, ehrlich: Wer Optik zum Klicken haben will, sollte VisualBasicScript verwenden, meiner Meinung nach.
chris0815
chris0815 09.05.2011 um 13:48:05 Uhr
Goto Top
Moin,


Das ist das Problem, was ich bei diesen "Delims" habe. Ich versteh nicht, was das Bedeutet. Laut Hilfe von FOR gibt es einen Satz von Trennzeichen an. Aber was nützt mir das jetzt?

Hier nochmal der optimierte codeschnipsel


@echo off
cls
echo Daten Downloaden?
SET /p auswahl=
if %auswahl%==j (goto yes1) else (goto beenden)

:yes1
echo FTP-Verbindung herstellen
ftp -s:conn.ect
echo Download beendet


Bis hierher ist alles schick. Jetzt soll die Prüfung stattfinden, ob die heruntergeladenen Dateien schon im Ordner X:\auftraege\2011\gedruckt vorhanden sind:

REM echo #######################################
REM echo ## Prüfe auf Vorhandensein der Daten ##
REM echo #######################################

for /f "delims=" %%a in ('xcopy "X:\auftraege\2011\*.dat" "X:\auftraege\2011\gedruckt" /D') do PRINT /D:"\\ServerName\DruckerName" "%%a"


Das ist eben mein Problem.

Dein Code, soweit ich ihn verstehe, druckt die DAT-Dateien (welche sich ja in der Variablen %%a befinden) und verschiebt sie dann in den ordner X:\auftraege\2011\gedruckt.

Das macht mein Script im Endeffekt auch nicht anders, jedoch komplizierter, wenn ich es denn richtig verstanden habe.


Ich würde gern die Prüfung so gestalten, dass das Script folgendermaßen prüft:

- Lade Dateien in Ordner "X:\auftraege\2011" -> Macht das Script ja bereits
- Prüfe ob Dateien im Ordner "X:\auftraege\2011" evtl. schon vorhanden in Ordner "X:\auftraege\2011\gedruckt" -> Diese Prüfroutine fehlt mir noch

Hier ein Beispiel:

Download "Datei1.dat"
Download "Datei2.dat"
Download "Datei3.dat"

Prüfe:

- Datei1.dat + Datei2.dat -> vorhanden in Ordner "X:\auftraege\2011" -> und vorhanden in Ordner "X:\auftraege\2011\gedruckt"
- Datei3.dat -> vorhanden in Ordner "X:\auftraege\2011" -> aber nicht vorhanden in Ordner "X:\auftraege\2011\gedruckt"
- Ignoriere Datei1.dat + Datei2.dat
- Drucke nur Datei3.dat
- gehe zu löschen


:loeschen
echo Aufträge löschen?
SET /p auswahl=
if '%auswahl%'=='j' (goto yes2) else (goto beenden)

:yes2
cd /D "X:\auftraege\2011"
del *.dat

:beenden
pause
exit



Vielleicht kann man ja auch was mit dem Muster machen: FZ_Firma_20110506.laufendeNummer.dat

Kannst du mir evtl. noch einen anderen Vorschlag unterbreiten.

Auch wäre es nett, wenn du mir deine Codeschnipsel etwas erklären könntest.


Vielen Dank nochmal im Voraus und auch für deine Bemühungen sowie für dein Verständnis bisher.
Skyemugen
Skyemugen 09.05.2011 um 14:31:38 Uhr
Goto Top
Aloha,

tu mir bitte einen Gefallen, gib' mal xcopy /? ein und schau mal, wozu ich den Schalter /D eingebaut habe.

Wenn du mir allerdings jetzt sagen willst, dass er dennoch alles kopiert, dann würde ich mir Gedanken machen, warum alle Dateien als neuer deklariert werden. (Und auch erst dann wenn dem wirklich so ist, kann man anfangen, extra Daten zu vergleichen)

greetz André
chris0815
chris0815 13.05.2011 um 08:23:51 Uhr
Goto Top
Moin,

habe nun das Script nochmals getestet.

Bin jedoch wieder an einem Problem angekommen.

Das Script hängt sich regelrecht auf bei der Prüfung durch die FOR-Schleife.
Ungeduld kann es auch nicht sein, da ich 15 min. gewartet habe und dennoch nichts passierte.

Drücke ich dann STRG+C fängt der Drucker auf einmal an zu drucken, jedoch nur 2 Seiten, wovon auf 1er Seite 2 W´s stehen (Wahrscheinlich der Abbruch-Code oder so etwas -> ich weiss es nicht.)
Angezeigt bekomme ich jedoch nichts (Fehler oder Ähnliches).

Kannst du mir hierzu noch etwas sagen woran das liegen könnte?
Skyemugen
Skyemugen 13.05.2011 um 09:01:26 Uhr
Goto Top
Aloha,

edit nö, derzeit nicht, sofern die Dateien selbst nicht in Benutzung sind, sollte da kein Problem sein (die Schleife funktioniert jedenfalls, wobei die Zollzeichen doch wohl überflüssig sind bei der Druckerzuweisung, da print wohl generell nur mit Druckerfreigabenamen ohne Leerzeichen klarkommt) ...

Wie groß sind denn die Dateien im Durchschnitt und wie viele werden pro Durchlauf ca. angefasst?

Mach doch mal echo on und schau' nach, was die cmd denn so erzählt, wo es hängt.

greetz André
chris0815
chris0815 13.05.2011 um 11:12:41 Uhr
Goto Top
Also generell hat dieser Drucker leider Leerzeichen.
Kann ich auch nicht ändern, da kein Zugriff.

Habe anstatt PRINT auch schon mal mit copy gespielt, jedoch ebenfalls ohne Erfolg.

Das Problem besteht weiterhin, mit dem hängen. Hintergrund ist, dass er fragt, ob die vorhandenen Dateien im Ordner "...\gedruckt" überschrieben werden sollen. Genau das sollte doch aber eigentlich der Parameter /D bei xcopy garnicht hervorrufen, da nur Dateien neueren Datums kopiert werden oder?

Ich habe also noch /Y hinzugefügt, womit der Drucker alle DAT-Dateien gedruckt hat, auch die alten.


Angefasst werden pro Tag immer mehr Dateien, heute z. B. schon 10 Stück, da ja immer alle wieder heruntergeladen werden und dann geprüft werden müssten.

Die Größe liegt ca. zwischen 0,5 MB bis 1,5 MB.


Ich persönlich wäre dankbar über eine Lösung, welche keine Schleife hat, sondern sich einfach nur auf den Dateinahmen bezieht.
Grund ist, sofern ich richtig liege, dass ja immer wieder alle Dateien heruntergeladen werden, demnach auf dem System auch immer ein aktuelles Datum haben und somit ja auch wiederum alles immer gedruckt werden würde.
Das xcopy /D funktioniert demnach eben auch nicht so wie es sollte, da er das Dateidatum immer wieder auf den Tag des Herunterladens setzt.

Beispielhaft wäre eine Lösung welche:

- einfach nur die Dateinamen vergleicht
- wenn Dateiname der selbe ist -> nicht drucken
- wenn Dateiname nicht der selbe ist -> Datei ausdrucken

Den Rest macht das Script ja bereits.

Hättest du hier evtl. einen Lösungsvorschlag, bzw. einen Hinweis, wie ich vorgehen könnte.
Ich probiere auch gern selbst, musst also kein fertiges Script hier schreiben. Ein schöner Vorschlag mit evtl. Beispiel reicht mir ja schon aus.
Skyemugen
Skyemugen 13.05.2011 um 11:45:39 Uhr
Goto Top
Zitat von @chris0815:
Also generell hat dieser Drucker leider Leerzeichen.
Und print funktioniert? ... erstaunlich, habe noch nie einen Drucker so mit Leerzeichen angesprochen bekommen, selbst wenn Zollzeichen gesetzt waren - nun gut.

Habe anstatt PRINT auch schon mal mit copy gespielt, jedoch ebenfalls ohne Erfolg.
Das kann ich mir ...
Das Problem besteht weiterhin, mit dem hängen. Hintergrund ist, dass er fragt, ob die vorhandenen Dateien im Ordner
"...\gedruckt" überschrieben werden sollen. Genau das sollte doch aber eigentlich der Parameter /D bei xcopy
garnicht hervorrufen, da nur Dateien neueren Datums kopiert werden oder?
bei dieser Ursache natürlich vorstellen - und jaein:

/D dient dazu neuere Dateien zu kopieren, ausgehend davon, dass existierende Dateien nicht neu modifiziert werden oder als neu gesetzt werden, habe ich natürlich /Y weggelassen ...
Ich habe also noch /Y hinzugefügt, womit der Drucker alle DAT-Dateien gedruckt hat, auch die alten.
Hm, nein, an sich nur die neuen, jedoch scheinen schon vorhandene (oder wie du es nennst alte) Dateien in der Quelle ständig als neu gesetzt zu werden (sprich: das Dateidatum ändert sich fortlaufend) ... ich schätze dass der Download der Dateien dafür sorgt, dass sie als neuer bzw modifiziert gelten ...

Ich persönlich wäre dankbar über eine Lösung, welche keine Schleife hat, sondern sich einfach nur auf den Dateinahmen bezieht.
Schleife gibt es so oder so, immerhin müssen dann mehrere Dateien verglichen werden.
Grund ist, sofern ich richtig liege, dass ja immer wieder alle Dateien heruntergeladen werden,
werden ja so oder so ... ist ja dein Ausgang, mget *dat ... you see?
Das xcopy /D funktioniert demnach eben auch nicht so wie es sollte, da er das Dateidatum immer wieder auf den Tag des Herunterladens setzt.
ACK.

Beispielhaft wäre eine Lösung welche:

- einfach nur die Dateinamen vergleicht
- wenn Dateiname der selbe ist -> nicht drucken
- wenn Dateiname nicht der selbe ist -> Datei ausdrucken

Hättest du hier evtl. einen Lösungsvorschlag, bzw. einen Hinweis, wie ich vorgehen könnte.
Ich probiere auch gern selbst, musst also kein fertiges Script hier schreiben. Ein schöner Vorschlag mit evtl. Beispiel
reicht mir ja schon aus.

Mal sehen, habe gerade dringendes immer ist alles dringend ... Zeug auf dem Tisch face-wink

greetz André
Skyemugen
Skyemugen 13.05.2011 um 13:11:20 Uhr
Goto Top
Aloha,

nun, da ich heute eh kein Mittagessen habe, kommen wir eventuell hier voran:

@echo off & setlocal
set "Quelle=X:\auftraege\2011"  
set "Ziel=X:\auftraege\2011\gedruckt"  
set "Typ=*.dat"  

for /f "delims=" %%s in ('dir /b /a-d "%Quelle%\%Typ%"') do (  
if not exist "%Ziel%\%%s" move "%Quelle%\%%s" "%Ziel%" && PRINT /D:"\\ServerName\DruckerName" "%Ziel%\%%s"  
)
pause
goto :eof

greetz André
chris0815
chris0815 13.05.2011 um 15:06:12 Uhr
Goto Top
Das ist ja ein richtiger Traum, der da gerade wahr wurde.

Danke dir erstmal für deine viele Mühe.

Habe das nun eingebaut und ausprobiert.

Im Groben und Ganzen funktioniert es.

Aber:

Irgendwie druckt er mir nur die vorletzte Datei aus, welche jedoch aber auch schon vorhanden ist.

Hier das Beispiel (Bitte auf Aufzählung 1. und 2. achten):

Dateien im Ordner "...\gedruckt" sind folgende:

FZ_FIRMA_20110510.044507.dat
FZ_FIRMA_20110510.044511.dat
FZ_FIRMA_20110511.044532.dat
FZ_FIRMA_20110511.044538.dat
FZ_FIRMA_20110512.044523.dat
FZ_FIRMA_20110513.044518.dat -> 2. Diese hat er mir jedoch gedruckt
FZ_FIRMA_20110513.044527.dat -> 1. Diese Datei hat das Script verschoben! Habe ich auch absichtlich im Ordner "...\gedruckt" gelöscht, damit er diese drucken würde.

Das verstehe ich jedoch nun garnicht mehr, da dein Code ja, und das verstehe sogar ich halbwegs, genau das nicht machen würde (theoretisch).

Hast du vllt. hierzu noch eine Idee warum?


Auch beendet sich das Programm nach dieser Schleife, obwohl ich das goto :eof rausgenommen habe und das Script weiterlaufen würde.
Auch ein && goto :wasweissich vor der schließenden Klammer geht nicht.

Hast du hierzu noch ne Idee?
Vllt. ENDLOCAL ???


Ich weiss, dass ich viele Fragen und kuriose Probleme habe. Ich möchte dir an diesem Punkt nochmals herzlich für deine Mühe und deine geleistete Arbeit danken.
Hoffentlich bist du nicht allzu genervt von mir.
Skyemugen
Skyemugen 13.05.2011 um 15:15:17 Uhr
Goto Top
Aloha,

erstmal keine Ahnung => Hab Feierabend *gg* bei mir hat die Schleife brav alles gedruckt, was in %%s steckte ...

endlocal geschieht automatisch beim Schließen ...

Vielleicht sind ihm die Datenmengen zu groß, kP - dann eventuell so:

for /f "delims=" %%s in ('dir /b /a-d "%Quelle%\%Typ%"') do call :Ablauf "%%s"  
goto :wasdanachgeschehensoll

:Ablauf
if not exist "%Ziel%\%~1" move "%Quelle%\%~1" "%Ziel%"  
PRINT /D:"\\ServerName\DruckerName" "%Ziel%\%~1"  
goto :eof

greetz André
chris0815
chris0815 16.05.2011 um 10:52:30 Uhr
Goto Top
Moin,

habe auch diese Variante versucht, leider ohne Erfolg.

Hier bringt er mir jedoch einen Fehler, nämlich:

Das Sprungziel Ablauf wurde nicht gefunden.

Habe es dann so umgeschrieben, dass die Schleife durchlaufen wird:

for /f "delims=" %%s in ('dir /b /a-d "%Quelle%\%Typ%"') do call (Ablauf) "%%s"   // habe Ablauf in Klammern gesetzt
goto :wasdanachgeschehensoll 

:Ablauf
if not exist "%Ziel%\%~1" move "%Quelle%\%~1" "%Ziel%"
PRINT /D:"\\ServerName\DruckerName" "%Ziel%\%~1"
goto :eof

Jetzt druckt und verschiebt er mir jedoch nichts mehr.

Auch die Abänderung auf:

for /f "delims=" %%s in ('dir /b /a-d "%Quelle%\%Typ%"') do call (Ablauf "%%s")   // habe Ablauf + %%s in Klammern gesetzt
goto :wasdanachgeschehensoll 

:Ablauf
if not exist "%Ziel%\%%s" move "%Quelle%\%%s" "%Ziel%"
PRINT /D:"\\ServerName\DruckerName" "%Ziel%\%%s"
goto :eof

Auch das funktioniert nicht. Er durchläuft die Schleife, aber verschiebt und druckt nichts.

Das mit dem %~1 ist mir jedoch auch nicht wirklich klar geworden -> die Bedeutung.

So langsam verstehe ich gar nicht mehr, warum das denn nun nicht funktioniert.
Skyemugen
Skyemugen 16.05.2011 um 11:22:21 Uhr
Goto Top
Aloha,

was du da machst, ist auch totaler ... call :Ablauf "%%s" ist ein zusammenhängender Befehl (inklusive Sprungmarke) und da muss weder eine Klammer noch sonst etwas hin, desweiteren solltest du nicht einfach Doppelpunkte löschen, wenn ich sie dir vorgebe ...
if Ablauf==Sprungmarke (echo OK) else (echo Befehl nicht gefunden && echo Das Sprungziel Ablauf wurde nicht gefunden.)
> Befehl nicht gefunden 
> Das Sprungziel Ablauf wurde nicht gefunden

Zur Erklärung: Alle Ergebnisse der Schleife werden in der Variable %%s ausgegeben.
Durch call :Ablauf "%%s" rufe ich die Sprungmarke :Ablauf auf mit der Übergabe der Varialbe %%s, welche mit Zollzeichen übergeben wird, um zusammenhängend bearbeitet zu werden.
In :Ablauf selber wird aus der Variable %%s jeweils nacheinander ein Datensatz übergeben und ist dort dann als Parameter %1 definiert, da dieser im Pfad, welcher bereits in Zollzeichen gesetzt ist, eingesetzt wird, setze ich %~1 um überflüssige Zollzeichen zu entfernen, denn sonst hättest du das Ergebnis "X:\auftraege\2011\gedruckt\"FZ_FIRMA_20110510.044507.dat"" was bei XP evtl. ignoriert aber bei Windows 7 zur Fehlermeldung führen wird.

Wenn er die Sprungmarke nicht aufrufen kann, geschieht natürlich auch kein move oder print, da dann goto :wasdanachgeschehensoll direkt im Anschluss greift und %%s wird in :Ablauf gar nichts bewirken, da %%s nicht definiert ist, da die Schleife außerhalb der Bearbeitung liegt.

greetz André
chris0815
chris0815 16.05.2011 um 12:54:05 Uhr
Goto Top
for /f "delims=" %%s in ('dir /b /a-d "%Quelle%\%Typ%"') do call :Ablauf "%%s"

Wenn ich das genau so stehen lasse wie du es vorgibst, mit dem Doppelpunkt, ohne Klammern usw., dann zeigt er mir:

Das Sprungziel - Ablauf wurde nicht gefunden.


Ergo, kann das ja dann so nicht richtig sein.

Den Rest habe ich ja dann nur ausprobiert, weil er mir eben genau diese Fehlermeldung zeigte.
Skyemugen
Skyemugen 16.05.2011 um 13:34:42 Uhr
Goto Top
Zitat von @chris0815:
Ergo, kann das ja dann so nicht richtig sein.

Aloha,

da setze ich 20 Pfund Sterling dagegen face-wink

Ich habe testweise den Käse von hier nochmal direkt c&p und trotz des, durch die Forumsoftware angehängten, überflüssigen Leerzeichens hinter :Ablauf funktioniert der gesamte Aufruf und Ablauf (höhö) so wie es soll: Ohne Fehlermeldung oder Probleme.

greetz André
Biber
Biber 16.05.2011 um 13:35:33 Uhr
Goto Top
Moin chris0815,

hast du denn auch eine Sprungmarke für ":goto :wasdanachgeschehensoll " angelegt?
Wenn nicht (bzw wenn danach nichts geschehen soll) , dann musst du "goto :wasdanachgeschehensoll" durch "goto :eof" ersetzen.

Grüße
Biber
Skyemugen
Skyemugen 16.05.2011 um 13:37:24 Uhr
Goto Top
Aloha Biber,

nichtsdestotrotz sollte dann nicht
Das Sprungziel - Ablauf wurde nicht gefunden.
dort stehen, sondern
Das Sprungziel - wasdanachgeschehensoll wurde nicht gefunden.
... oder nicht? Und das auch erst nach dem gesamten Durchlauf der Schleife ... (und das würde man auch nur sehen, wenn man die batch im cmd ausführt und nicht per Doppelklick, da diese sich danach einfach schließt ^_^)

Hm ...

greetz André
chris0815
chris0815 16.05.2011 um 14:03:54 Uhr
Goto Top
@ Skyermugen:

Der Fehler "Das Sprungziel - Ablauf wurde nicht gefunden." wird auch so oft angezeigt, wie DAT-Dateien vorhanden sind (bei mir z. Zeit 10 Stück), also wird es 10 mal angezeigt und dann springt er zu

goto :wasdanachgeschehensoll

und macht brav weiter


Die 20 Pfund Sterling face-smile kannst du gerne setzen. Das Problem ist halt, dass es bei dir geht, bei mir jedoch nicht. *gg*
Das wurmt mich ungemein!

@ Biber:
alles soweit definiert.
Skyemugen
Skyemugen 16.05.2011 um 14:22:45 Uhr
Goto Top
Aloha,

mir ist klar, dass er das bei jeder Datei anzeigt - ist auch logisch.

Du hast jetzt folgende Möglichkeiten:

  • Du schreibst das gesamte DO noch einmal händisch mit dem :Namendeinerwahl und ersetzt die Zeile :Ablauf durch den :Namendeinerwahl, in dem Glauben, dass die Zeilen korrupt sind oder
  • Du erstellst eine gänzlich neue Datei mit dem Code, in dem Glauben, dass die aktuelle Batchdatei korrupt ist ...
oder
  • Du glaubst, dass der Code falsch ist und erstellst eine neue Datei zum Test mit dem Inhalt:
@echo off & setlocal
set "Quelle=X:\auftraege\2011"  
set "Ziel=X:\auftraege\2011\gedruckt"  
set "Typ=*.dat"  

for /f "delims=" %%s in ('dir /b /a-d "%Quelle%\%Typ%"') do call :Namendeinerwahl "%%s"  
pause
goto :eof

:Namendeinerwahl
echo %~1
goto :eof
wo du auch im Nachhinein den Namen am Besten editierst - eventuell sogar alles selber tippst - in dem Glauben, dass durch das c&p etwas nicht funktionieren könnte ...

greetz André
chris0815
chris0815 16.05.2011 um 15:58:01 Uhr
Goto Top
Hallo André,


Hier meine Test.bat, mit c&p deines Codes, ausgeführt im Ordner X:/auftraege/2011 in einem CMD-Fenster (ohne Doppelklick auf die Bat-Datei):

@echo off & setlocal 
set "Quelle=X:\auftraege\2011"
set "Ziel=X:\auftraege\2011\gedruckt"
set "Typ=*.dat"
for /f "delims=" %%s in ('dir /b /a-d "%Quelle%\%Typ%"') do call :drucken "%%s"
pause
goto :eof

:drucken
echo %~1
if not exist "%Ziel%\%~1" move "%Quelle%\%~1" "%Ziel%"
PRINT /D:"\\Server\Druckername" "%Ziel%\%~1"                         // Den Druckernamen habe ich selbstverständlich eingefügt
goto :eof

Und hier kommt das Ergebnis:

FZ_Firma_20110505.044522.dat
Das Sprungziel - drucken wurde nicht gefunden.
FZ_Firma_20110506.044513.dat
Das Sprungziel - drucken wurde nicht gefunden.
FZ_Firma_20110509.044522.dat
Das Sprungziel - drucken wurde nicht gefunden.
FZ_Firma_20110510.044507.dat
Das Sprungziel - drucken wurde nicht gefunden.
FZ_Firma_20110510.044511.dat
Das Sprungziel - drucken wurde nicht gefunden.
FZ_Firma_20110511.044532.dat
Das Sprungziel - drucken wurde nicht gefunden.
FZ_Firma_20110511.044538.dat
Das Sprungziel - drucken wurde nicht gefunden.
FZ_Firma_20110512.044523.dat
Das Sprungziel - drucken wurde nicht gefunden.
FZ_Firma_20110513.044518.dat
Das Sprungziel - drucken wurde nicht gefunden.
FZ_Firma_20110513.044527.dat
Das Sprungziel - drucken wurde nicht gefunden.
Drücken Sie eine beliebige Taste . . .

Ich sehe hier nunmal keinen Fehler.


ich glaube nicht, dass durch c&p etwas falsch sein könnte. Die Zeilennummern lösche ich selbstverständlich.
Ich glaube weiterhin nicht, dass die Batchdatei "korrupt" ist.

Ich glaube jedoch, dass ich, wenn ich alles schön selbst nochmal abschreibe, mehr Fehler passieren, als wenn ich c&p anwende.
Ich glaube auch, dass du langsam genervt bist, obwohl ich dir, meiner Meinung nach keinen Grund liefere, um dezent sarkastisch zu werden.

Da du hier der Einzige bist, der mir überhaupt zu helfen versucht (Ausnahme 1 Antwort von Biber), kann ich es nicht ändern, wenn du immer wieder Arbeit damit hast.
Du musst jedoch nicht, das ist reinweg deine freiwillige Handlung. Wenn du nicht mehr willst, sag es einfach ehrlich und dann ist gut.

Es wäre schön, wenn sich mehr hier beteiligen würden zu diesem Thema und evtl. Lösungsvorschläge posten. Dann wäre die Lösung evtl. auch schon da.
Es fehlt ja nur noch ein Quentchen.

Vielen Dank.
Skyemugen
Skyemugen 16.05.2011 um 16:09:45 Uhr
Goto Top
Aloha,

kannst du mal bitte noch etwas tun:

  • setze mal echo on und zusätzlich
  • füge pause hinter jede Zeile im einzelnen Ablauf ein

denn ich will jetzt mal sehen wo genau er versucht wieder zu springen, denn scheinbar (wenn ich das richtig sehe) gibt er echo %~1 aus, was bedeutet, dass er bereits in der Sprungmarke sich befindet, mir allerdings schleierhaft ist, wann er jetzt wo wie versucht erneut zu :drucken zu gehen.

(Genau deswegen wollte ich auch erst einmal nur echo %~1 ohne weiteren Firlefanz, um zu sehen, ob er nicht doch schon springt, was er ja scheinbar tut - aber gut, jetzt sehen wir mit pause und echos mal rein ^_^)

greetz André

P.S.: Hm, meinen üblichen Sarkasmus habe ich bisher noch gar nicht einfließen lassen aber ja, ich bin ein wenig entnervt, was mich nicht daran hindert, hier eine Lösung zu finden - denn ich mag keine unabgeschlossenen Projekte. die hätte man dann nämlich gleich sein lassen können - time must not be wasted har har
60730
60730 16.05.2011 um 23:14:33 Uhr
Goto Top
echo off... oder moin...

C:\>md C:\script\test\123\

C:\>md C:\script\test\123\gedruckt

C:\>for /l %a in (1,1,9) do echo test>C:\script\test\123\fz_%a.dat

C:\>echo test 1>C:\script\test\123\fz_1.dat

C:\>echo test 1>C:\script\test\123\fz_2.dat

C:\>echo test 1>C:\script\test\123\fz_3.dat

C:\>echo test 1>C:\script\test\123\fz_4.dat

C:\>echo test 1>C:\script\test\123\fz_5.dat

C:\>echo test 1>C:\script\test\123\fz_6.dat

C:\>echo test 1>C:\script\test\123\fz_7.dat

C:\>echo test 1>C:\script\test\123\fz_8.dat

C:\>echo test 1>C:\script\test\123\fz_9.dat

set "Quelle=C:\script\test\123"   

set "Ziel=C:\script\test\123\gedruckt"   

set "Typ=*.dat"   

for /f "delims=" %%s in ('dir /b /a-d "%Quelle%\%Typ%"') do call :drucken "%%s"   

pause 

goto :eof 

 

:drucken 

echo %~1 

if not exist "%Ziel%\%~1" move "%Quelle%\%~1" "%Ziel%"   

PRINT /D:"\\Server\Druckername" "%Ziel%\%~1"                         // Den Druckernamen habe ich selbstverständlich eingefügt   

goto :eof

C:\>C:\script\test\123\123.cmd

C:\>set "Quelle=C:\script\test\123"

C:\>set "Ziel=C:\script\test\123\gedruckt"

C:\>set "Typ=*.dat"

C:\>for /F "delims=" %s in ('dir /b /a-d "C:\script\test\123\*.dat"') do call :d
rucken "%s"

C:\>call :drucken "fz_1.dat"

C:\>echo fz_1.dat
fz_1.dat

C:\>if not exist "C:\script\test\123\gedruckt\fz_1.dat" move "C:\script\test\123
\fz_1.dat" "C:\script\test\123\gedruckt"

C:\>PRINT /D:"\\Server\Druckername" "C:\script\test\123\gedruckt\fz_1.dat"
                   // Den Druckernamen habe ich selbstverstõndlich eingef³gt
Unzulässige Option - //

C:\>goto :eof

C:\>call :drucken "fz_2.dat"

C:\>echo fz_2.dat
fz_2.dat

C:\>if not exist "C:\script\test\123\gedruckt\fz_2.dat" move "C:\script\test\123
\fz_2.dat" "C:\script\test\123\gedruckt"

C:\>PRINT /D:"\\Server\Druckername" "C:\script\test\123\gedruckt\fz_2.dat"
                   // Den Druckernamen habe ich selbstverstõndlich eingef³gt
Unzulässige Option - //

C:\>goto :eof

C:\>call :drucken "fz_3.dat"

C:\>echo fz_3.dat
fz_3.dat

C:\>if not exist "C:\script\test\123\gedruckt\fz_3.dat" move "C:\script\test\123
\fz_3.dat" "C:\script\test\123\gedruckt"

C:\>PRINT /D:"\\Server\Druckername" "C:\script\test\123\gedruckt\fz_3.dat"
                   // Den Druckernamen habe ich selbstverstõndlich eingef³gt
Unzulässige Option - //

C:\>goto :eof

C:\>call :drucken "fz_4.dat"

C:\>echo fz_4.dat
fz_4.dat

C:\>if not exist "C:\script\test\123\gedruckt\fz_4.dat" move "C:\script\test\123
\fz_4.dat" "C:\script\test\123\gedruckt"

C:\>PRINT /D:"\\Server\Druckername" "C:\script\test\123\gedruckt\fz_4.dat"
                   // Den Druckernamen habe ich selbstverstõndlich eingef³gt
Unzulässige Option - //

C:\>goto :eof

C:\>call :drucken "fz_5.dat"

C:\>echo fz_5.dat
fz_5.dat

C:\>if not exist "C:\script\test\123\gedruckt\fz_5.dat" move "C:\script\test\123
\fz_5.dat" "C:\script\test\123\gedruckt"

C:\>PRINT /D:"\\Server\Druckername" "C:\script\test\123\gedruckt\fz_5.dat"
                   // Den Druckernamen habe ich selbstverstõndlich eingef³gt
Unzulässige Option - //

C:\>goto :eof

C:\>call :drucken "fz_6.dat"

C:\>echo fz_6.dat
fz_6.dat

C:\>if not exist "C:\script\test\123\gedruckt\fz_6.dat" move "C:\script\test\123
\fz_6.dat" "C:\script\test\123\gedruckt"

C:\>PRINT /D:"\\Server\Druckername" "C:\script\test\123\gedruckt\fz_6.dat"
                   // Den Druckernamen habe ich selbstverstõndlich eingef³gt
Unzulässige Option - //

C:\>goto :eof

C:\>call :drucken "fz_7.dat"

C:\>echo fz_7.dat
fz_7.dat

C:\>if not exist "C:\script\test\123\gedruckt\fz_7.dat" move "C:\script\test\123
\fz_7.dat" "C:\script\test\123\gedruckt"

C:\>PRINT /D:"\\Server\Druckername" "C:\script\test\123\gedruckt\fz_7.dat"
                   // Den Druckernamen habe ich selbstverstõndlich eingef³gt
Unzulässige Option - //

C:\>goto :eof

C:\>call :drucken "fz_8.dat"

C:\>echo fz_8.dat
fz_8.dat

C:\>if not exist "C:\script\test\123\gedruckt\fz_8.dat" move "C:\script\test\123
\fz_8.dat" "C:\script\test\123\gedruckt"

C:\>PRINT /D:"\\Server\Druckername" "C:\script\test\123\gedruckt\fz_8.dat"
                   // Den Druckernamen habe ich selbstverstõndlich eingef³gt
Unzulässige Option - //

C:\>goto :eof

C:\>call :drucken "fz_9.dat"

C:\>echo fz_9.dat
fz_9.dat

C:\>if not exist "C:\script\test\123\gedruckt\fz_9.dat" move "C:\script\test\123
\fz_9.dat" "C:\script\test\123\gedruckt"

C:\>PRINT /D:"\\Server\Druckername" "C:\script\test\123\gedruckt\fz_9.dat"
                   // Den Druckernamen habe ich selbstverstõndlich eingef³gt
Unzulässige Option - //

C:\>goto :eof

C:\>pause
Drücken Sie eine beliebige Taste . . .

Noch Fragen Kienzle?
chris0815
chris0815 18.05.2011 um 09:09:30 Uhr
Goto Top
@ André

ich glaube ich habs. Getestet habe ich es mit 1 fehlenden Datei und 2 fehlenden Dateien im Ordner ..\gedruckt.
Beides wurde anstandslos gedruckt.

Hier der funktionierende Code:

@echo on
setlocal 
set "Quelle=X:\auftraege\2011"
set "Ziel=X:\auftraege\2011\gedruckt"
set "Typ=*.dat"
for /f "delims=" %%s in ('dir /b /a-d "%Quelle%\%Typ%"') do call :sub %%s
goto :eof

:sub
echo %~1
if not exist "%Ziel%\%~1" move "%Quelle%\%~1" "%Ziel%" | (ping 127.0.0.1 -n 4 > nul) & copy "%Ziel%\%~1" "\\Server\Druckername"
goto :eof

Der Fehler lag wahrscheinlich an einem zu langen Pfad. Der richtige Pfad ist länger gewesen, als der hier angegebene.
Der PRINT-Befehl wirkte hier auch nicht mehr so wie er vorher ging. PRINT werde ich also meiden, obwohl es vorher einmal ging.

An diese Stelle nochmals vielen herzlich Dank für deine Hilfe André. Du hast nicht nur Nerven gelassen und dich nerven lassen sondern mir auch noch extrem geholfen. Schön erklärt und einwandfrei durchgezogen. Großes Lob an dich, auch wenn du dir davon nichts kaufen kannst.


@ TimoBeil

Keine Fragen mehr, aber ein Kommentar an dich.

Wenn du helfen willst, dann tu es auch und poste nicht einfach sinnlos.

Dass die -> // <- unzulässig sind und dass ich die bestimmt hier im Forum einfach dahintergesetzt habe, um André alles zu erklären, was er wissen musste, kann man sich, meiner Meinung nach denken.


@least

Problem gelöst -> Beitrag gelöst -> bitte schließen. Danke.