keiosid
Goto Top

Eine Batch Datei bleibt immer wieder stehen

Batchdatei hängt sich immer wieder auf in Verbindung mit einem Schedule Task

Hallo,

ich habe ein Problem mit folgender Batchanwendung.

Die folgende Scriptanwendung wird über den Windows Scheduler jede Minute gestartet und abgearbeitet.

Wenn ich in das zu überwachende Verzeichnis Tesdateien kopiere, funktioniert alles einwandfrei.

Werden aber über eine entsprechende Applikation Dateien in das Verzeichnis geschrieben, hängt sich das Script oder der Scheduler auf.

Diese muss ich dann immer manuell stoppen und neu starten.

Eine Vermutung habe ich noch:
Kann es sein, wenn die Applikation Dateien schreibt, und dafür, ich sage mal 5 Minuten für eine Datei braucht,
die neue Datei gesperrt ist. Mein Script sich aber hier schon eine Variable merkt, mit dieser aber nichts anfangen kann und
sich so aufhängt.

Vielen Dank im Voraus für eine Idee.

Nun das besagt Script:

rem ////////////////////////////////////////////////
set counter=0
set maxcount=10

:start

	rem Etiketten und Chechire
		set "Pfad=C:\Streamserve\spoolcitrix\AboOut00*.*"  
		if not exist C:\Streamserve\\spoolcitrix\AboOut00*.* goto Palettenleitzettel
		for /f "delims=" %%i in ('echo %Pfad%') do set "varib=%%~nxi"  
		copy C:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\save\Adware\raw 
:warten1
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varib%" goto warten1  
		move c:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\Print\Adware\Versandunterlagen



	
:Palettenleitzettel
	rem Palettenleitzettel	
		set "Pfad=C:\Streamserve\spoolcitrix\AboZePlt*.*"  
		if not exist C:\Streamserve\\spoolcitrix\AboZePlt*.* goto Bundzettel
		for /f "delims=" %%i in ('echo %Pfad%') do set "varib=%%~nxi"  
		copy C:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\save\Adware\raw
:warten2
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varib%" goto warten2  
		move C:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\Print\Adware\Versandunterlagen


:Bundzettel
	rem Bundzettel
		set "Pfad=C:\Streamserve\spoolcitrix\AboZeBnd*.*"  
		if not exist C:\Streamserve\\spoolcitrix\AboZeBnd*.* goto Ende
		for /f "delims=" %%i in ('echo %Pfad%') do set "varib=%%~nxi"  
		copy C:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\save\Adware\raw
:warten3
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varib%" goto warten3  
		move C:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\Print\Adware\Versandunterlagen


:Ende

set /a counter=%counter% + 1
if "%counter%" NEQ "%maxcount%" goto start  

echo Filemove_Versandunterlagen_SpoolCitrix_to_Print.bat gelaufen am %date% um %time% >> c:\Batch\Spoolcitrix.txt 2>&1

exit


rem ////////////////////////////////////////////////

Content-ID: 130848

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

Ausgedruckt am: 15.11.2024 um 13:11 Uhr

miniversum
miniversum 03.12.2009 um 12:34:25 Uhr
Goto Top
Ich habe die Batch jetzt nicht so genau durchgeschaut, aber es kann schon dran liegen das du die datei die gerade noch geschrieben wird verschieben willst.
Um das zu testen kannst du ja mal einfach die Zeit von 1 auf z.B. 5 Minuten erhöhen und sehen ob es daran liegt.
Ist das der Fall kannst du eine Kontrolle im z.B. 4 Sekunden Abstand einbauen die immer wieder die Änderungszeit der Datei kontrolliert. Hat sich die Änderungszeit in den letzten 4 sekunden nicht verändert kann die Datei weiter verarbeitet werden.
Biber
Biber 03.12.2009 um 13:26:05 Uhr
Goto Top
Moin KeiosID,

mir geht es ähnlich wie miniversum... ich schaffe es auch gar nicht, die Batch bis zum Ende zu lesen, weil ich vorher schon über Sachen stolpere, die -wie der Franzose sagt- unpredictable results erzeugen könnten und sicherlich so gar nicht bewusst da implementiert werden sollten.

Abgebrochen mit dem Lesen habe ich am Ende des ":start"-Blocks (Zeilen 08-11)

Das kann nicht so gewollt sein.
....
               set "Pfad=C:\Streamserve\spoolcitrix\AboZePlt*.*"   
               if not exist C:\Streamserve\\spoolcitrix\AboOut00*.* goto Palettenleitzettel
		for /f "delims=" %%i in ('echo %Pfad%') do set "varib=%%~nxi"   
		copy C:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\save\Adware\raw  
...

0) Eine Anweisung "Setlocal" sollte ganz oben rein - gerade wenn es sein kann, dass mehrere Batchinstanzen zeitgleich laufen und est recht, wenn es nicht stabil läuft und manche davon endlos kreisen und/oder abgebrochen werden müssen.

1) Die Anweisung [set "Pfad=C:\Streamserve\spoolcitrix\AboZePlt*.*"] gilt für den gesamten Batch und gehört damit auch nach ganz oben.
2) Wenn es die Variable "%Pfad%" gibt, dann muss sie auch hier benutzt werden: [if not exist C:\Streamserve\\spoolcitrix\AboOut00*.* goto Palettenleitzettel ]
3) Die Zeile hier ist nicht richtig...hier hast du ein Zufallsergebnis [for /f "delims=" %%i in ('echo %Pfad%') do set "varib=%%~nxi"]
4) Die Zeile [copy C:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\save\Adware\raw ] unmittelbar danach macht zwar dann alles, was sie soll, ist aber auf die marode Zeile davor angewiesen. Wenn in der FOR-Anweisungszeile KEINE Variable %varib% neu gesetzt wird, dann rennt diese Zeile halt mit dem %variab%-Wert der Vorrunde nochmal im Kreis ...

Die marode Zeile [for /f "delims=" %%i in ('echo %Pfad%') do set "varib=%%~nxi" ] nehme ich mal gesondert auseinander.
Wenn ich an meinem heimischen CMD-prompt spiele und das auf meine dateien "E:\Dokus\*.PDF" anwende (wo ein paar Dutzend *.pdfs liegen, dann kömmt herum:
[das ">" nicht mit eingeben - ist mein Prompt]
>set "Var=e:\dokus\*.pdf"  
(=13:13:57  D:\temp=)
>for /f "delims=" %i in ("%var%") do @echo set "varib=%~nxi"  
set "varib=VB_Puzzlebuch.pdf"  
##oder gleichbedeutend, nur umständlicher wie oben
(=13:14:16  D:\temp=)
>for /f "delims=" %i in ('echo "%var%"') do @echo set "varib=%~nxi"  
set "varib=VB_Puzzlebuch.pdf"  
---> d.h. auch wenn sich 27000 *.pdf-Dateien in dem Verzeichnis habe, wird immer nur "die erste" (nach welchen Kriterien auch immer sortiert) gefunden.
Dafür bräuchte ich keine FOR-Anweisung... und außerdem erst recht keine "FOR /F "delims"-Special-Edition, sondern eine einfache FOR %i Anweisung.
> FOR %i in ("%var%") do Echo whatever with "%~nxi"  

Also würde ich zumindest diese Böcke rausschmeißeb und dann weiterfahnden:
...
Setlocal
...
Set ... (counter etc wie oben)
 set "Pfad=C:\Streamserve\spoolcitrix\AboZePlt*.*"   

:Start
               if not exist "%pfad%" goto Palettenleitzettel  
		for  %%i in ("%Pfad%") do (   
		         copy "%%i"  "\\sedemune0044\Streamserve\save\Adware\raw\%%~nxi"  
               )
......

Weiter lohnt es sich IMHO noch nicht, nach Fehlern zu suchen (könnten alles Folgefehler sein).

Grüße
Biber
KeiosID
KeiosID 03.12.2009 um 13:30:21 Uhr
Goto Top
Hi Biber,

ich werde Deinen ausführlichen Kommentar jetzt erstmal verarbeiten und mich dann wieder melden.

Vielen Dank erstmal

Grüße

Keios
KeiosID
KeiosID 03.12.2009 um 14:59:23 Uhr
Goto Top
Hallo Biber,

vielen Dank für Deine Ratschläge.

Ich habe das jetzt alle soweit umgesetzt und um ein wenig erweitert.

Allerdings habe ich jetzt irgendwie ein grundsätzliche haken drinn. Das Script fällt im aktuellen Zustand ab Pause 5.1 in eine Endlosschleife.

vorher werden die Befehle auch nicht wirklich abgearbeitet.

Das CMD liefert:
C:\Batch>for %i in ("C:\Streamserve\spoolcitrix\AboOut00*.*)" do set "varibA=%~n
xi" pause pause4 copy "%i" "\\sedemune0044\Streamserve\save\Adware\raw" :warten1
if not exist "\\sedemune0044\Streamserve\save\Adware\raw\" goto warten1 move "c
:\Streamserve\spoolcitrix\" "\\sedemune0044\Streamserve\Print\Adware\Versandunte
rlagen" :Palettenleitzettel pause pause5 rem Palettenleitzettel if not exist "C:
\Streamserve\spoolcitrix\AboZePlt*.* goto Bundzettel for %i in ("C:\Streamserve\
spoolcitrix\AboZePlt*.*") do set "varibB=%~nxi"

C:\Batch>set "varibB=do"

C:\Batch>set "varibB=set"

C:\Batch>set "varibB=varibA=%~nxi"

C:\Batch>set "varibB=pause"

C:\Batch>set "varibB=pause4"

C:\Batch>set "varibB=copy"

C:\Batch>set "varibB=%i"

C:\Batch>set "varibB=raw"

C:\Batch>set "varibB=:warten1"

C:\Batch>set "varibB=if"

C:\Batch>set "varibB=not"

C:\Batch>set "varibB=exist"

C:\Batch>set "varibB="

C:\Batch>set "varibB=goto"

C:\Batch>set "varibB=warten1"

C:\Batch>set "varibB=move"

C:\Batch>set "varibB="

C:\Batch>set "varibB=Versandunterlagen"

C:\Batch>set "varibB=:Palettenleitzettel"

C:\Batch>set "varibB=pause"

C:\Batch>set "varibB=pause5"

C:\Batch>set "varibB=rem"

C:\Batch>set "varibB=Palettenleitzettel"

C:\Batch>set "varibB=if"

C:\Batch>set "varibB=not"

C:\Batch>set "varibB=exist"

C:\Batch>copy "%i" "\\sedemune0044\Streamserve\save\Adware\raw"
The system cannot find the file specified.

C:\Batch>pause pause5.1
Press any key to continue . . .

Und so sieht der Code im Monment aus(ein kleiner Wust wegwn der Pause Dateien)


rem ////////////////////////////////////////////////


set counter=0
set maxcount=10
set "PfadA=C:\Streamserve\spoolcitrix\AboOut00*.*"  
set "PfadB=C:\Streamserve\spoolcitrix\AboZePlt*.*"  
set "PfadC=C:\Streamserve\spoolcitrix\AboZeBnd*.*"  
set "Pfadprint=\\sedemune0044\Streamserve\Print\Adware\Versandunterlagen"  
set "Pfadraw=\\sedemune0044\Streamserve\save\Adware\raw"  


pause pause1

:start
pause pause2

	rem Etiketten und Chechire
		
		if not exist "%PfadA%" goto Palettenleitzettel  
pause pause3


		for %%i in ("%PfadA%)" do set "varibA=%%~nxi"  
pause pause4

		copy "%%i" "%Pfadraw%"   
:warten1
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varibA%" goto warten1  
		move "c:\Streamserve\spoolcitrix\%varibA%" "%Pfadprint%"  



:Palettenleitzettel
pause pause5

	rem Palettenleitzettel	
	
		if not exist "%PfadB% goto Bundzettel  
		for %%i in ("%PfadB%") do set "varibB=%%~nxi"  
		copy "%%i" "%Pfadraw%"  
pause pause5.1
:warten2
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varibB%" goto warten2  
		move "C:\Streamserve\spoolcitrix\%varibB%" "%Pfadprint%"  


:Bundzettel
pause pause6

	rem Bundzettel
		
		if not exist %PfadC% goto Ende
		for %%i in ("%PfadC%") do set "varibC=%%~nxi"  
		copy "%%i" "%Pfadraw%"  
:warten3
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varib%" goto warten3  
		move "C:\Streamserve\spoolcitrix\%varibC%" "%Pfadprint%"  


:Ende

set /a counter=%counter% + 1
if "%counter%" NEQ "%maxcount%" goto start  

echo Filemove_Versandunterlagen_SpoolCitrix_to_Print.bat gelaufen am %date% um %time% >> c:\Batch\Spoolcitrix.txt 
pause pause7

exit
KeiosID
KeiosID 03.12.2009 um 15:19:15 Uhr
Goto Top
ACHTUNG, ein Fehler schon gefunden

In Zeile 24 sitzt das " falsch

rennt aber immernoch in eine Endlosschleife

diesmal aber schon früher

C:\Batch>if not exist "\\sedemune0044\Streamserve\save\Adware\raw\AboOut00_V_BFA
_TEST_Klein_13-08-09_10-08.TXT" goto warten1

Anscheinend funktioniert der coppy Befehl noch nicht richtig.

Grüße
KeiosID
KeiosID 03.12.2009 um 16:27:34 Uhr
Goto Top
Hm,

der coppy Befehl funktioniert nun prima,

allerdings kopiert er gleich alle 3 Dateien, der move funktioniert danach nurnoch auf eine Datei.

wo liegt denn nun die Crux?

Grüße

KeiosID
KeiosID
KeiosID 04.12.2009 um 11:40:40 Uhr
Goto Top
Hallo,

aus folgendem Script erhalte ich folgendes Ergebnis
set counter=0
set maxcount=10
set "Pfad=C:\Streamserve\spoolcitrix\"  
set "PfadA=C:\Streamserve\spoolcitrix\AboOut00*.*"  
set "PfadB=C:\Streamserve\spoolcitrix\AboZePlt*.*"  
set "PfadC=C:\Streamserve\spoolcitrix\AboZeBnd*.*"  
set "Pfadprint=\\sedemune0044\Streamserve\Print\Adware\Versandunterlagen"  
set "Pfadraw=\\sedemune0044\Streamserve\save\Adware\raw"  

:start
	rem Etiketten und Chechire
		
		if not exist "%PfadA%" goto Palettenleitzettel  
		for %%i in ("%PfadA%") do set "varibA=%%~nxi"  
echo "%varibA%"  
		copy "%Pfad%\%variabA%" "%Pfadraw%"   
:warten1
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varibA%" goto warten1  
		move "c:\Streamserve\spoolcitrix\%varibA%" "%Pfadprint%"  
pause pause2

Ergebnis:

C:\Batch>echo "AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT"
"AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT"

C:\Batch>copy "C:\Streamserve\spoolcitrix\\" "\\sedemune0044\Streamserve\save\Ad
ware\raw"
C:\Streamserve\spoolcitrix\\AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT
C:\Streamserve\spoolcitrix\\AboZeBnd_V_FS_2009-12_TESTrs-Institut_19-11-09_03-19
.TXT
C:\Streamserve\spoolcitrix\\AboZePlt_V_FS_2009-12_TESTt_19-11-09_03-19.TXT
3 file(s) copied.


Ich wollte aber eigentlich erreichen, dass in diesem Teil nur die Dateien kopiert werden, die mit AboOut00*.txt beginnen kopiert werden.

Die andern Dateien sollen später kopiert werden und dann auch in entsprechnede andere Verzeichnise kopiert werden.

Wie kann ich das umsetzen? (Dabei muss ich auch beachten, dass die Dateien beim erstellen auch mal bis zu 5 minuten gesperrt sein können)

Vielen Dank im Voraus.

Habe durch mein gekrixel jetzt den Thread hoffentlich nicht unnötig vergrößert.

Grüße

KeiosID
Biber
Biber 04.12.2009 um 12:26:17 Uhr
Goto Top
Moin KeiosID,

sorry für die späte Antwort - hatte nicht die nötige Muße für dein Problem.

Aber nochmal - das Problem, das ich in meinem ersten Kommentar ausschliessen wollte ist jetzt wieder/immer noch im Sourcecode.
In deinen jetzt geposteten Zeilen 13/14/15 passiert nicht das, was du beabsichtigst.
...
		for %%i in ("%PfadA%") do set "varibA=%%~nxi"
                echo "%varibA%"
		copy "%Pfad%\%variabA%" "%Pfadraw%"
....

Die erste dieser Zeilen [FOR %%i in (AlleDateienXY) Do set "varibA=EineVonAllenDateienXY" ] rödelt wirklich durch alle vorhandenen 187 Dateien durch.
Am Ende des Tages bzw. am Ende der Zeile hast Du dann aber nur den Namen der 187sten Datei, des letzten Elements diser Liste in der Variablen %varibA%.
Und auch nur auf diese eine einzige Datei werden die beiden nachfolgenden Anweisungen angewandt.

!! Bitte ändere diesen Abschnitt möglichst mit dem Ziel, dass die Variable %varibA% ganz wegfällt.
...
		for %%i in ("%PfadA%") do (
                         echo Bearbeite Datei %%~nxi
	            	 copy "%Pfad%\%%~nxi" "%Pfadraw%"
                )
...

Grüße
Biber
KeiosID
KeiosID 04.12.2009 um 14:14:21 Uhr
Goto Top
Hallo Biber,

ich habe das jetz mal so gelöst:
		if not exist "%PfadA%" goto Palettenleitzettel  
pause pause1.1
		for %%i in ("%PfadA%") do (  
			echo Bearbeite Datei für copy %%~nxi
			copy "%Pfad%\%%~nxi" "%Pfadraw%"   
			echo Bearbeite Datei für move %%~nxi
			move "%Pfad%\%%~nxi" "%Pfadprint%"   
			)
pause pause2

So funktioniert das eigentlich auf den ersten Blick ganz gut.


Dazu aber noch einige Fragen:
1. Was passiert, wenn die Datei, die gerade kopiert wird eine größere Datei ist, sagen wir mal 150Mb? Wartet hier dann das cmd von alleine, bis der Kopiervorgan fertig ist
und arbeitet dann erst den move ab?
1.1. Was passiert wenn es mehrer Dateien mit dem Typ AboOut00*.txt gibt.(kommt vor)
2. Was passiert, wenn die Datei noch von der Applikation im Zugriff ist? Genauer, die Datei wird geschrieben und wächst solange, bis diese fertig ist.
3. Kann ich hier nun das analog für andere Dateitypen kopiern und anpassen?

Danke im Voraus

Gruß

Keios
Danke
Biber
Biber 04.12.2009 um 14:44:20 Uhr
Goto Top
Moin keiosID,

Zitat von @KeiosID:
1. Was passiert, wenn die Datei, die gerade kopiert wird eine größere Datei ist, sagen wir mal 150Mb?
Wartet hier dann das cmd von alleine, bis der Kopiervorgan fertig ist und arbeitet dann erst den move ab?
Ja..
1.1. Was passiert wenn es mehrer Dateien mit dem Typ AboOut00*.txt gibt.(kommt vor)
Dann dauerts mal wieder ein wenig länger.
2. Was passiert, wenn die Datei noch von der Applikation im Zugriff ist?
Genauer, die Datei wird geschrieben und wächst solange, bis diese fertig ist.
Wenn die Datei hoch von einer anderen Appz im exklusiven Zugriff gehalten wird, dann lässt sich nicht ohne Fehler kopieren.
Und diesen Fall kannst in der Zeile nach dem COPY ja prüfen mit "IF ERRORLEVEL 1 goto :tryAgain" und ":tryAgain" vor den COPY-Befehl setzen.

Wenn die Datei sich COPYren liess, dann kann der MOVE danach ja keine Probleme mehr haben. Eigentlich...

3. Kann ich hier nun das analog für andere Dateitypen kopiern und anpassen?
Kannst Du mir ein anderes Beispiel für rhetorische Fragen geben?

Danke im Voraus
Dafür nich'.

Gruß Keios

Grüße
Biber
KeiosID
KeiosID 04.12.2009 um 15:04:34 Uhr
Goto Top
Hi Biber,

Nochmal zu Punkt 2

Hier bekomme ich einen Syntax Fehler, wenn ich den Goto Befehl innerhalb der FOR Schleife einbaue.

pause pause1
	rem Etiketten und Chechire
		
		if not exist "%PfadA%" goto Palettenleitzettel  
pause pause1.1
		for %%i in ("%PfadA%") do (  
			echo Bearbeite Datei fuer copy %%~nxi
:tryAgain
			copy "%Pfad%\%%~nxi" "%Pfadraw%"  
			"IF ERRORLEVEL 1 goto tryAgain"  
			echo Bearbeite Datei fuer move %%~nxi
			move "%Pfad%\%%~nxi" "%Pfadprint%"   
			)
pause pause2

Ergebnis:


C:\Batch>for %i in ("C:\Streamserve\spoolcitrix\AboOut00*.*") do (
echo Bearbeite Datei fuer copy %~nxi
copy "C:\Streamserve\spoolcitrix\%~nxi" "\\sedemune0044\Streamserve\save\Adware
\raw"
"IF ERRORLEVEL 1 goto tryAgain"
echo Bearbeite Datei fuer move %~nxi
move "C:\Streamserve\spoolcitrix\%~nxi" "\\sedemune0044\Streamserve\Print\Adwar
e\Versandunterlagen"
)

C:\Batch>(
echo Bearbeite Datei fuer copy AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT
copy "C:\Streamserve\spoolcitrix\AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT"
"\\sedemune0044\Streamserve\save\Adware\raw"
"IF ERRORLEVEL 1 goto tryAgain"
echo Bearbeite Datei fuer move AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT
move "C:\Streamserve\spoolcitrix\AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT"
"\\sedemune0044\Streamserve\Print\Adware\Versandunterlagen"
)
Bearbeite Datei fuer copy AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT
1 file(s) copied.
'"IF ERRORLEVEL 1 goto tryAgain"' is not recognized as an internal or external c
ommand,
operable program or batch file.
Bearbeite Datei fuer move AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT
1 file(s) moved.


Um diesen Syntaxfehler zu umgehen, muss ich dass dann in zwei Schleifen verpacken(hintereinander)?

Und zieht sich dann die zweite Schleife für den move Befehl den gleichen %%~nxi Wert, wie der Befehl für den Copy?

Grüße
Keios
(bitte um Nachsicht für rethorische oder teilrethorische Fragen....)
Biber
Biber 04.12.2009 um 15:09:12 Uhr
Goto Top
Moin KeiosID,

sorry, mein Fehler.
Die Zeile "IF ERRORLEVEL 1 goto tryAgain" (bei dir Zeile10) bitte OHNE Anführungszeichen eingeben.
IF ERRORLEVEL 1 goto :tryAgain

Grüße
Biber
KeiosID
KeiosID 04.12.2009 um 15:27:49 Uhr
Goto Top
Hi Biber,

wird das script nun Korrekt abgearbeitet (Ich vermute mal wieder einen leicht rethorischen Character, da die Dateien ja kopiert und verschoben werden)?

Hauptsächlich der hervorgehobene Teil. Ist das nur nochmal die @echo on Funktion des cmds?

Ergebnis
C:\Batch>for %i in ("C:\Streamserve\spoolcitrix\AboOut00*.*") do (
echo Bearbeite Datei fuer copy %~nxi
 copy "C:\Streamserve\spoolcitrix\%~nxi" "\\sedemune0044\Streamserve\save\Adware\raw"
 IF ERRORLEVEL 1 goto :tryAgain
 echo Bearbeite Datei fuer move %~nxi
 move "C:\Streamserve\spoolcitrix\%~nxi" "\\sedemune0044\Streamserve\Print\Adware\Versandunterlagen"
)

**
C:\Batch>(
echo Bearbeite Datei fuer copy AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT
 copy "C:\Streamserve\spoolcitrix\AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT" "\\sedemune0044\Streamserve\save\Adware\raw"
 IF ERRORLEVEL 1 goto :tryAgain
 echo Bearbeite Datei fuer move AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT
 move "C:\Streamserve\spoolcitrix\AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT" "\\sedemune0044\Streamserve\Print\Adware\Versandunterlagen"
)
**
Bearbeite Datei fuer copy AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT
        1 file(s) copied.
Bearbeite Datei fuer move AboOut00_V_BFA_TEST_Klein_13-08-09_10-08.TXT
        1 file(s) moved.


[Edit Biber] In Code-Tags gesetzt, weil ich es gerne lesen wollte. [/Edit]
Biber
Biber 04.12.2009 um 17:01:03 Uhr
Goto Top
Moin KeiosID,

wird das script nun Korrekt abgearbeitet ?
Ich sag mal so, zumindest würde ich sagen Works as designed.
Und scheint zu tun, was ein Skript halt so tun soll.

Noch ein, zwei kosmetische Änderungsvorschläge:

@echo off & setlocal
:: .... variablen-Initialisierung etc..
pause pause1
	rem Etiketten und Chechire
		
		if not exist "%PfadA%" goto Palettenleitzettel  
pause pause1.1
		for %%i in ("%PfadA%") do (  
			echo Bearbeite Datei fuer copy %%~nxi
:tryAgain
			copy "%Pfad%\%%~nxi" "%Pfadraw%" >nul ||goto :tryAgain  
			echo Bearbeite Datei fuer move %%~nxi
			move "%Pfad%\%%~nxi" "%Pfadprint%" >nul  
			)
pause pause2

--> Ich habe "nur" an die Befehlszeilen COPY und MOVE ein ">nul" angehängt, damit die (kein-Fehler-)Meldung "1 file(s) copied/moved" nicht erscheint.
--> denn wenn überhaupt interessiert mich ja nicht die Nicht-Fehlerfall-Meldung, sondern höchstens die Fehlerfallmeldung ("File in use by another DAU" o.ä.)
--> Achtung!! --a) wenn das COPY nicht klappt, macht der Batch ein "tryAgain" bis Weihnachten. Genauer gesagt bis Weihnachten 2199.
--> Achtung!! --b) wenn das MOVE nicht klappt, ignoriere ich das (keine Fehlerbehandlung). Weil.... weil ich sage, einen Fehler an dieser Stelle schließe ich aus.(Siehe "Das Telekom-Prinzip" oder "Regierungserklärung Merkel" ) Da passiert halt per definitione nichts Abweichendes von meinem Plan face-wink

Falls ich dich verwirrt habe nochmal zusammengefasst:
  • sieht so aus, als würde der Schnipsel jetzt das machen, was er soll
  • zwei Annahmen sind implementiert, die nicht verifiziert sind: a) Ein COPY-Fehler tritt immer nur temporär auf und b) ein MOVE geht immer
  • Die beiden letzten Annahmen würde ich "im Auge behalten", aber dennoch den Schnipsel so einsetzen.
  • Von daher könntest du aus meiner Sicht noch heute ein Häkchen in der Farbe eines hinter die Spüle gefallenen Kaffee-Pads setzen

Grüße
Biber
KeiosID
KeiosID 05.12.2009 um 16:11:28 Uhr
Goto Top
Hi Biber,

vielen Dank,

ich werde es am Montag korrigieren, da ich momentan kein Zugriff auf die Server habe.

Ein schönes Wochenende noch.

Grüße in den Norden

Keios
KeiosID
KeiosID 08.12.2009 um 10:46:15 Uhr
Goto Top
Hi Biber,

ich habe die modifikatione übernommen(die Ksmetik noch nich.

Allerdings hatte ich promt das Prblem, dass sich das Script beim copy befel augehängt hat.

Jetzt habe ich es etwas avgeändrt, unwar gehe ic in der Errorschleife nicht auf Tryagain, sondernwieder zum ANfag des jeweiligen abschnitts.

Seh Code:

set "counter=0"  
set "maxcount=10"  
set "Pfad=C:\Streamserve\spoolcitrix"  
set "PfadA=C:\Streamserve\spoolcitrix\AboOut00*.*"  
set "PfadB=C:\Streamserve\spoolcitrix\AboZePlt*.*"  
set "PfadC=C:\Streamserve\spoolcitrix\AboZeBnd*.*"  
set "PfadD=C:\Streamserve\spoolcitrix\eds_*.*"  
set "Pfadprint=\\sedemune0044\Streamserve\Print\Adware\Versandunterlagen"  
set "Pfadraw=\\sedemune0044\Streamserve\save\Adware\raw"  
set "Pfadeds=\\sprdc01\transportmedia$\Prod\Exportlisten"  

:start
	rem Etiketten und Chechire
:Etiketten
		if not exist "%PfadA%" goto Palettenleitzettel  
		
		for %%i in ("%PfadA%") do (  
			echo Bearbeite Datei fuer copy %%~nxi
			copy "%Pfad%\%%~nxi" "%Pfadraw%"  
			IF ERRORLEVEL 1 goto Etiketten**
			echo Bearbeite Datei fuer move %%~nxi
			move "%Pfad%\%%~nxi" "%Pfadprint%"   
			)
	

**:Palettenleitzettel**
		rem Palettenleitzettel
		if not exist "%PfadB%" goto Bundzettel  
		for %%i in ("%PfadB%") do (  
			echo Bearbeite Datei fuer copy %%~nxi
			copy "%Pfad%\%%~nxi" "%Pfadraw%"  
			IF ERRORLEVEL 1 goto Palettenleitzettel
			echo Bearbeite Datei fuer move %%~nxi
			move "%Pfad%\%%~nxi" "%Pfadprint%"   
			)

:Bundzettel
	rem Bundzettel
						
		if not exist "%PfadC%" goto Versandlisten  
		for %%i in ("%PfadC%") do (  
			echo Bearbeite Datei fuer copy %%~nxi
			copy "%Pfad%\%%~nxi" "%Pfadraw%"  
			IF ERRORLEVEL 1 goto Bundzettel
			echo Bearbeite Datei fuer move %%~nxi
			move "%Pfad%\%%~nxi" "%Pfadprint%"   
			)
			
:Versandlisten
	rem Versandlisten
						
		if not exist "%PfadD%" goto Ende  
		for %%i in ("%PfadD%") do (  
			echo Bearbeite Datei fuer copy %%~nxi
			copy "%Pfad%\%%~nxi" "%Pfadraw%"  
			if ERRORLEVEL 1 goto Versandlisten
			echo Bearbeite Datei fuer move %%~nxi
			move "%Pfad%\%%~nxi" "%Pfadeds%"   
			)
				
:Ende
pause pause4
set /a counter=%counter% + 1
if "%counter%" NEQ "%maxcount%" goto start  

echo Filemove_Versandunterlagen_SpoolCitrix_to_Print.bat gelaufen am %date% um %time% >> c:\Batch\Spoolcitrix.txt 
pause
exit

Nun meine Frage:
Wie verhält sich das Sript nun i einem Errorfall?
Habe ich nun wieder eine Endloschleife im Falle eines Copy Errors gebaut, oder löse ich das Errorhandling hier in sich selbst auf?

Danke

Grüße

Keios
Biber
Biber 08.12.2009 um 20:07:34 Uhr
Goto Top
Moin KeiosID,

also...
  • ich gehe davon aus, dass die "**" nach "Etiketten" (Zeile 20) und rund um ":Palettenleitzettel" nur Formatierungsversuche, aber nicht im tatsächlichen Code enthalten sind? Falls doch im Code, dann ist es ebensolcher. Dann bitte ändern.
  • ich sehe keinen Vorteil, bei einem "COPY-Fehler" nochmal so weit zurückzugehen bzw. die ganze FOR %%i in (dateien)-Anweisung nochmal neu zu starten. Aber okay - würde auch nix kaputtmachen
  • was allerdings wohl nicht klappen wird (soweit habe ich beim ersten Mal ja gar nicht gelesen wegen der angesprochenen Bugs)- der MOVE.Befehl kann (zumindest unter XP und früher) NUR auf demselben Laufwerk verschieben. Ein MOVE von C:\bla\x.y nach C:\Blubb ist okay; ein MOVE von c:\bla\x.y nach D:\blubb oder \\server\blabb geht nicht. Hier müsstest du den "logischen MOVE" selbst machen durch ein "COPY c:\bla\x.y D:\blubb" und anschliessendes "Del c:\Blubb\x.y".

Sonst sehe ich mit bloßem Auge nichts -- gibt/gab es denn irgendwelche FehlerMELDUNGEN?

Grüße
Biber
KeiosID
KeiosID 09.12.2009 um 13:07:59 Uhr
Goto Top
Hallo Biber,

ja, das mit den ´**´ waren Formatierungsversuche.

Nun, ich hatte gerade eben einen Testlauf in meiner Produktivumgebung.
Das Script, so wie es oben steht, funktioniert im Moment.

Solange die Datei noch im Zugriff ist, läuft das Script in eine Endlosschleife, bis die Datei freigegeben wird.
Als ich den :TryAgain Punkt drinnen hatte, hat das Script immer nach einer~%nxi Datei gesucht und sich komplett aufgehängt. Daher bin ich nochmals ein Schritt weiter vor gegangen.

Der Move befehl funktiniert hier auch über die UNC Pfade hinweg.
Kann es sein, dass das mit dem Move Befahl an dem Betriebssystem liegt(Server2003).

Vielen Dank für die Hilfen.

Jetzt warte ich noch zwei Tage, dann werde ich das Thema als gelöst schließen.

Grüße

KeiosID