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

Batch FOR-Schleife Dateien vergleichen und drucken

Frage Entwicklung Batch & Shell

Mitglied: chris0815

chris0815 (Level 1) - Jetzt verbinden

09.05.2011, aktualisiert 18.05.2011, 5968 Aufrufe, 23 Kommentare

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:

01.
@echo off 
02.
cls 
03.
echo. 
04.
echo. 
05.
echo ################################################## 
06.
echo ## Moechten Sie die Daten jetzt herunterladen ? ## 
07.
echo ##						## 
08.
echo ##        Druecken Sie J/N und dann ENTER       ## 
09.
echo ################################################## 
10.
echo. 
11.
echo ################################################# 
12.
echo ## Dieser Vorgang kann bis zu 5 Minuten dauern ## 
13.
echo ##					       ## 
14.
echo ##        Bitte haben Sie etwas Geduld.        ## 
15.
echo ################################################# 
16.
echo. 
17.
echo. 
18.
SET /p auswahl= 
19.
if %auswahl%==j goto yes1 
20.
if %auswahl%==n goto no1 
21.
 
22.
:no1 
23.
goto kopieren 
24.
 
25.
:yes1 
26.
echo. 
27.
echo ########################### 
28.
echo ## Starte FTP-Verbindung ## 
29.
echo ########################### 
30.
echo. 
31.
echo. 
32.
ftp -s:conn.ect  
33.
 
34.
 
35.
// hier der Auszug aus der conn.ect-Datei: 
36.
 
37.
OPEN IP-ADRESSE 
38.
Benutzername 
39.
Passwort 
40.
lcd "X:\lokaler_Ordner\" 
41.
cd /order/auf/ftp 
42.
binary 
43.
mget *.dat 
44.
45.
46.
close 
47.
quit 
48.
 
49.
// Ende Auszug conn.ect-Datei 
50.
 
51.
echo. 
52.
echo. 
53.
echo ###################### 
54.
echo ## Download beendet ## 
55.
echo ###################### 
56.
echo. 
57.
echo. 
58.
 
59.
REM echo ####################################### 
60.
REM echo ## Prüfe auf Vorhandensein der Daten ## 
61.
REM echo ####################################### 
62.
 
63.
// hier ist jetzt mein Problem (Problemdarstellung siehe unten) 
64.
 
65.
:kopieren 
66.
echo. 
67.
echo. 
68.
echo ################################################ 
69.
echo ##  Moechten Sie die Auftraege verschieben ?  ## 
70.
echo ##					      ## 
71.
echo ##      Druecken Sie J/N und dann ENTER       ## 
72.
echo ################################################ 
73.
echo. 
74.
echo. 
75.
SET /p auswahl= 
76.
if '%auswahl%'=='j' goto yes3 
77.
if '%auswahl%'=='n' goto no3 
78.
 
79.
:no3 
80.
goto printing 
81.
 
82.
:yes3 
83.
echo. 
84.
echo. 
85.
xcopy X:\auftraege\2011\gedruckt /-Y 
86.
// Befehl erstmal dafür da, dass man sieht, ob Dateien schon vorhanden (Notlösung) 
87.
 
88.
 
89.
ping -n 4 127.0.0.1 >nul 
90.
 
91.
 
92.
:printing 
93.
echo. 
94.
echo ############################################# 
95.
echo ##       Moechten Sie jetzt drucken ?      ## 
96.
echo ##					   ## 
97.
echo ##  !!! BITTE WEISSES PAPIER EINLEGEN !!!  ## 
98.
echo ##					   ## 
99.
echo ##     Druecken Sie J/N und dann ENTER     ## 
100.
echo ############################################# 
101.
echo. 
102.
echo. 
103.
SET /p auswahl= 
104.
if '%auswahl%'=='j' goto yes2 
105.
if '%auswahl%'=='n' goto no2 
106.
 
107.
:no2 
108.
goto loeschen 
109.
 
110.
:yes2 
111.
PRINT /D:"\\ServerName\DruckerName" *.dat 
112.
 
113.
 
114.
echo. 
115.
echo. 
116.
echo ################################################# 
117.
echo ## Druecken Sie eine beliebige Taste, wenn der ## 
118.
echo ##  Druckvorgang beendet ist, um fortzufahren  ## 
119.
echo ################################################# 
120.
echo. 
121.
echo. 
122.
 
123.
pause 
124.
 
125.
 
126.
:loeschen 
127.
echo. 
128.
echo. 
129.
echo ################################################# 
130.
echo ##  Moechten Sie die Auftraege nun loeschen ?  ## 
131.
echo ##					       ## 
132.
echo ##      Druecken Sie J/N und dann ENTER        ## 
133.
echo ################################################# 
134.
echo. 
135.
echo. 
136.
 
137.
SET /p auswahl= 
138.
if '%auswahl%'=='j' goto yes4 
139.
if '%auswahl%'=='n' goto no4 
140.
 
141.
:no4 
142.
goto beenden 
143.
 
144.
:yes4 
145.
cd /D "X:\auftraege\2011" 
146.
del *.dat 
147.
 
148.
:beenden 
149.
echo. 
150.
echo. 
151.
echo ################################################# 
152.
echo ##  Druecken Sie eine beliebige Taste, um das  ## 
153.
echo ##	      Programm zu beenden.             ## 
154.
echo ################################################# 
155.
pause 
156.
exit 
157.
 

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.
Mitglied: Skyemugen
09.05.2011 um 10:06 Uhr
Aloha,

bevor ich deinen EP weiterlese, tu uns allen bitte einen notwendigen Gefallen:
01.
nutze die Codeformatierung
siehe Formatierungshilfe (klick mich)

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]
Bitte warten ..
Mitglied: Skyemugen
09.05.2011 um 12:49 Uhr
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.
Bitte warten ..
Mitglied: chris0815
09.05.2011 um 13:48 Uhr
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.
Bitte warten ..
Mitglied: Skyemugen
09.05.2011 um 14:31 Uhr
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é
Bitte warten ..
Mitglied: chris0815
13.05.2011 um 08:23 Uhr
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?
Bitte warten ..
Mitglied: Skyemugen
13.05.2011 um 09:01 Uhr
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é
Bitte warten ..
Mitglied: chris0815
13.05.2011 um 11:12 Uhr
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.
Bitte warten ..
Mitglied: Skyemugen
13.05.2011 um 11:45 Uhr
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

greetz André
Bitte warten ..
Mitglied: Skyemugen
13.05.2011 um 13:11 Uhr
Aloha,

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

01.
@echo off & setlocal 
02.
set "Quelle=X:\auftraege\2011" 
03.
set "Ziel=X:\auftraege\2011\gedruckt" 
04.
set "Typ=*.dat" 
05.
 
06.
for /f "delims=" %%s in ('dir /b /a-d "%Quelle%\%Typ%"') do ( 
07.
if not exist "%Ziel%\%%s" move "%Quelle%\%%s" "%Ziel%" && PRINT /D:"\\ServerName\DruckerName" "%Ziel%\%%s" 
08.
09.
pause 
10.
goto :eof
greetz André
Bitte warten ..
Mitglied: chris0815
13.05.2011 um 15:06 Uhr
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.
Bitte warten ..
Mitglied: Skyemugen
13.05.2011 um 15:15 Uhr
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:

01.
for /f "delims=" %%s in ('dir /b /a-d "%Quelle%\%Typ%"') do call :Ablauf "%%s" 
02.
goto :wasdanachgeschehensoll 
03.
 
04.
:Ablauf 
05.
if not exist "%Ziel%\%~1" move "%Quelle%\%~1" "%Ziel%" 
06.
PRINT /D:"\\ServerName\DruckerName" "%Ziel%\%~1" 
07.
goto :eof
greetz André
Bitte warten ..
Mitglied: chris0815
16.05.2011 um 10:52 Uhr
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.
Bitte warten ..
Mitglied: Skyemugen
16.05.2011 um 11:22 Uhr
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é
Bitte warten ..
Mitglied: chris0815
16.05.2011 um 12:54 Uhr
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.
Bitte warten ..
Mitglied: Skyemugen
16.05.2011 um 13:34 Uhr
Zitat von chris0815:
Ergo, kann das ja dann so nicht richtig sein.

Aloha,

da setze ich 20 Pfund Sterling dagegen

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é
Bitte warten ..
Mitglied: Biber
16.05.2011 um 13:35 Uhr
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
Bitte warten ..
Mitglied: Skyemugen
16.05.2011 um 13:37 Uhr
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é
Bitte warten ..
Mitglied: chris0815
16.05.2011 um 14:03 Uhr
@ 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 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.
Bitte warten ..
Mitglied: Skyemugen
16.05.2011 um 14:22 Uhr
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:
01.
@echo off & setlocal 
02.
set "Quelle=X:\auftraege\2011" 
03.
set "Ziel=X:\auftraege\2011\gedruckt" 
04.
set "Typ=*.dat" 
05.
 
06.
for /f "delims=" %%s in ('dir /b /a-d "%Quelle%\%Typ%"') do call :Namendeinerwahl "%%s" 
07.
pause 
08.
goto :eof 
09.
 
10.
:Namendeinerwahl 
11.
echo %~1 
12.
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é
Bitte warten ..
Mitglied: chris0815
16.05.2011 um 15:58 Uhr
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.
Bitte warten ..
Mitglied: Skyemugen
16.05.2011 um 16:09 Uhr
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
Bitte warten ..
Mitglied: 60730
16.05.2011 um 23:14 Uhr
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
01.
set "Quelle=C:\script\test\123"  
02.
 
03.
set "Ziel=C:\script\test\123\gedruckt"  
04.
 
05.
set "Typ=*.dat"  
06.
 
07.
for /f "delims=" %%s in ('dir /b /a-d "%Quelle%\%Typ%"') do call :drucken "%%s"  
08.
 
09.
pause  
10.
 
11.
goto :eof  
12.
 
13.
  
14.
 
15.
:drucken  
16.
 
17.
echo %~1  
18.
 
19.
if not exist "%Ziel%\%~1" move "%Quelle%\%~1" "%Ziel%"  
20.
 
21.
PRINT /D:"\\Server\Druckername" "%Ziel%\%~1"                         // Den Druckernamen habe ich selbstverständlich eingefügt  
22.
 
23.
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?
Bitte warten ..
Mitglied: chris0815
18.05.2011 um 09:09 Uhr
@ 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.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch Änderungsdatum von Dateien vergleichen und ältere löschen (10)

Frage von 129528 zum Thema Batch & Shell ...

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

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Probleme mit Dateipfaden in for-Schleife (1)

Frage von Jonas1806 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (19)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

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

Frage von Haures zum Thema Windows Server ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...