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

Eine Batch Datei bleibt immer wieder stehen

Frage Entwicklung Batch & Shell

Mitglied: KeiosID

KeiosID (Level 1) - Jetzt verbinden

03.12.2009, aktualisiert 10:55 Uhr, 5049 Aufrufe, 18 Kommentare

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:

01.
rem //////////////////////////////////////////////// 
02.
set counter=0 
03.
set maxcount=10 
04.
 
05.
:start 
06.
 
07.
	rem Etiketten und Chechire 
08.
		set "Pfad=C:\Streamserve\spoolcitrix\AboOut00*.*" 
09.
		if not exist C:\Streamserve\\spoolcitrix\AboOut00*.* goto Palettenleitzettel 
10.
		for /f "delims=" %%i in ('echo %Pfad%') do set "varib=%%~nxi" 
11.
		copy C:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\save\Adware\raw  
12.
:warten1 
13.
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varib%" goto warten1 
14.
		move c:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\Print\Adware\Versandunterlagen 
15.
 
16.
 
17.
 
18.
	 
19.
:Palettenleitzettel 
20.
	rem Palettenleitzettel	 
21.
		set "Pfad=C:\Streamserve\spoolcitrix\AboZePlt*.*" 
22.
		if not exist C:\Streamserve\\spoolcitrix\AboZePlt*.* goto Bundzettel 
23.
		for /f "delims=" %%i in ('echo %Pfad%') do set "varib=%%~nxi" 
24.
		copy C:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\save\Adware\raw 
25.
:warten2 
26.
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varib%" goto warten2 
27.
		move C:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\Print\Adware\Versandunterlagen 
28.
 
29.
 
30.
:Bundzettel 
31.
	rem Bundzettel 
32.
		set "Pfad=C:\Streamserve\spoolcitrix\AboZeBnd*.*" 
33.
		if not exist C:\Streamserve\\spoolcitrix\AboZeBnd*.* goto Ende 
34.
		for /f "delims=" %%i in ('echo %Pfad%') do set "varib=%%~nxi" 
35.
		copy C:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\save\Adware\raw 
36.
:warten3 
37.
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varib%" goto warten3 
38.
		move C:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\Print\Adware\Versandunterlagen 
39.
 
40.
 
41.
:Ende 
42.
 
43.
set /a counter=%counter% + 1 
44.
if "%counter%" NEQ "%maxcount%" goto start 
45.
 
46.
echo Filemove_Versandunterlagen_SpoolCitrix_to_Print.bat gelaufen am %date% um %time% >> c:\Batch\Spoolcitrix.txt 2>&1 
47.
 
48.
exit 
49.
 
50.
 
51.
rem ////////////////////////////////////////////////
Mitglied: miniversum
03.12.2009 um 12:34 Uhr
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.
Bitte warten ..
Mitglied: Biber
03.12.2009 um 13:26 Uhr
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.
01.
.... 
02.
               set "Pfad=C:\Streamserve\spoolcitrix\AboZePlt*.*"  
03.
               if not exist C:\Streamserve\\spoolcitrix\AboOut00*.* goto Palettenleitzettel 
04.
		for /f "delims=" %%i in ('echo %Pfad%') do set "varib=%%~nxi"  
05.
		copy C:\Streamserve\spoolcitrix\%varib% \\sedemune0044\Streamserve\save\Adware\raw   
06.
...
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]
01.
>set "Var=e:\dokus\*.pdf" 
02.
(=13:13:57  D:\temp=) 
03.
>for /f "delims=" %i in ("%var%") do @echo set "varib=%~nxi" 
04.
set "varib=VB_Puzzlebuch.pdf" 
05.
##oder gleichbedeutend, nur umständlicher wie oben 
06.
(=13:14:16  D:\temp=) 
07.
>for /f "delims=" %i in ('echo "%var%"') do @echo set "varib=%~nxi" 
08.
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.
01.
> FOR %i in ("%var%") do Echo whatever with "%~nxi"
Also würde ich zumindest diese Böcke rausschmeißeb und dann weiterfahnden:
01.
... 
02.
Setlocal 
03.
... 
04.
Set ... (counter etc wie oben) 
05.
 set "Pfad=C:\Streamserve\spoolcitrix\AboZePlt*.*"  
06.
 
07.
:Start 
08.
               if not exist "%pfad%" goto Palettenleitzettel 
09.
		for  %%i in ("%Pfad%") do (  
10.
		         copy "%%i"  "\\sedemune0044\Streamserve\save\Adware\raw\%%~nxi" 
11.
12.
......
Weiter lohnt es sich IMHO noch nicht, nach Fehlern zu suchen (könnten alles Folgefehler sein).

Grüße
Biber
Bitte warten ..
Mitglied: KeiosID
03.12.2009 um 13:30 Uhr
Hi Biber,

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

Vielen Dank erstmal

Grüße

Keios
Bitte warten ..
Mitglied: KeiosID
03.12.2009 um 14:59 Uhr
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)






01.
rem //////////////////////////////////////////////// 
02.
 
03.
 
04.
set counter=0 
05.
set maxcount=10 
06.
set "PfadA=C:\Streamserve\spoolcitrix\AboOut00*.*" 
07.
set "PfadB=C:\Streamserve\spoolcitrix\AboZePlt*.*" 
08.
set "PfadC=C:\Streamserve\spoolcitrix\AboZeBnd*.*" 
09.
set "Pfadprint=\\sedemune0044\Streamserve\Print\Adware\Versandunterlagen" 
10.
set "Pfadraw=\\sedemune0044\Streamserve\save\Adware\raw" 
11.
 
12.
 
13.
pause pause1 
14.
 
15.
:start 
16.
pause pause2 
17.
 
18.
	rem Etiketten und Chechire 
19.
		 
20.
		if not exist "%PfadA%" goto Palettenleitzettel 
21.
pause pause3 
22.
 
23.
 
24.
		for %%i in ("%PfadA%)" do set "varibA=%%~nxi" 
25.
pause pause4 
26.
 
27.
		copy "%%i" "%Pfadraw%"  
28.
:warten1 
29.
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varibA%" goto warten1 
30.
		move "c:\Streamserve\spoolcitrix\%varibA%" "%Pfadprint%" 
31.
 
32.
 
33.
 
34.
:Palettenleitzettel 
35.
pause pause5 
36.
 
37.
	rem Palettenleitzettel	 
38.
	 
39.
		if not exist "%PfadB% goto Bundzettel 
40.
		for %%i in ("%PfadB%") do set "varibB=%%~nxi" 
41.
		copy "%%i" "%Pfadraw%" 
42.
pause pause5.1 
43.
:warten2 
44.
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varibB%" goto warten2 
45.
		move "C:\Streamserve\spoolcitrix\%varibB%" "%Pfadprint%" 
46.
 
47.
 
48.
:Bundzettel 
49.
pause pause6 
50.
 
51.
	rem Bundzettel 
52.
		 
53.
		if not exist %PfadC% goto Ende 
54.
		for %%i in ("%PfadC%") do set "varibC=%%~nxi" 
55.
		copy "%%i" "%Pfadraw%" 
56.
:warten3 
57.
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varib%" goto warten3 
58.
		move "C:\Streamserve\spoolcitrix\%varibC%" "%Pfadprint%" 
59.
 
60.
 
61.
:Ende 
62.
 
63.
set /a counter=%counter% + 1 
64.
if "%counter%" NEQ "%maxcount%" goto start 
65.
 
66.
echo Filemove_Versandunterlagen_SpoolCitrix_to_Print.bat gelaufen am %date% um %time% >> c:\Batch\Spoolcitrix.txt  
67.
pause pause7 
68.
 
69.
exit 
70.
 
Bitte warten ..
Mitglied: KeiosID
03.12.2009 um 15:19 Uhr
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
Bitte warten ..
Mitglied: KeiosID
03.12.2009 um 16:27 Uhr
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
Bitte warten ..
Mitglied: KeiosID
04.12.2009 um 11:40 Uhr
Hallo,

aus folgendem Script erhalte ich folgendes Ergebnis
01.
set counter=0 
02.
set maxcount=10 
03.
set "Pfad=C:\Streamserve\spoolcitrix\" 
04.
set "PfadA=C:\Streamserve\spoolcitrix\AboOut00*.*" 
05.
set "PfadB=C:\Streamserve\spoolcitrix\AboZePlt*.*" 
06.
set "PfadC=C:\Streamserve\spoolcitrix\AboZeBnd*.*" 
07.
set "Pfadprint=\\sedemune0044\Streamserve\Print\Adware\Versandunterlagen" 
08.
set "Pfadraw=\\sedemune0044\Streamserve\save\Adware\raw" 
09.
 
10.
:start 
11.
	rem Etiketten und Chechire 
12.
		 
13.
		if not exist "%PfadA%" goto Palettenleitzettel 
14.
		for %%i in ("%PfadA%") do set "varibA=%%~nxi" 
15.
echo "%varibA%" 
16.
		copy "%Pfad%\%variabA%" "%Pfadraw%"  
17.
:warten1 
18.
		if not exist "\\sedemune0044\Streamserve\save\Adware\raw\%varibA%" goto warten1 
19.
		move "c:\Streamserve\spoolcitrix\%varibA%" "%Pfadprint%" 
20.
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
Bitte warten ..
Mitglied: Biber
04.12.2009 um 12:26 Uhr
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
Bitte warten ..
Mitglied: KeiosID
04.12.2009 um 14:14 Uhr
Hallo Biber,

ich habe das jetz mal so gelöst:
01.
		if not exist "%PfadA%" goto Palettenleitzettel 
02.
pause pause1.1 
03.
		for %%i in ("%PfadA%") do ( 
04.
			echo Bearbeite Datei für copy %%~nxi 
05.
			copy "%Pfad%\%%~nxi" "%Pfadraw%"  
06.
			echo Bearbeite Datei für move %%~nxi 
07.
			move "%Pfad%\%%~nxi" "%Pfadprint%"  
08.
09.
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
Bitte warten ..
Mitglied: Biber
04.12.2009 um 14:44 Uhr
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
Bitte warten ..
Mitglied: KeiosID
04.12.2009 um 15:04 Uhr
Hi Biber,

Nochmal zu Punkt 2

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

01.
pause pause1 
02.
	rem Etiketten und Chechire 
03.
		 
04.
		if not exist "%PfadA%" goto Palettenleitzettel 
05.
pause pause1.1 
06.
		for %%i in ("%PfadA%") do ( 
07.
			echo Bearbeite Datei fuer copy %%~nxi 
08.
:tryAgain 
09.
			copy "%Pfad%\%%~nxi" "%Pfadraw%" 
10.
			"IF ERRORLEVEL 1 goto tryAgain" 
11.
			echo Bearbeite Datei fuer move %%~nxi 
12.
			move "%Pfad%\%%~nxi" "%Pfadprint%"  
13.
14.
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....)
Bitte warten ..
Mitglied: Biber
04.12.2009 um 15:09 Uhr
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
Bitte warten ..
Mitglied: KeiosID
04.12.2009 um 15:27 Uhr
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]
Bitte warten ..
Mitglied: Biber
04.12.2009 um 17:01 Uhr
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:

01.
@echo off & setlocal 
02.
:: .... variablen-Initialisierung etc.. 
03.
pause pause1 
04.
	rem Etiketten und Chechire 
05.
		 
06.
		if not exist "%PfadA%" goto Palettenleitzettel 
07.
pause pause1.1 
08.
		for %%i in ("%PfadA%") do ( 
09.
			echo Bearbeite Datei fuer copy %%~nxi 
10.
:tryAgain 
11.
			copy "%Pfad%\%%~nxi" "%Pfadraw%" >nul ||goto :tryAgain 
12.
			echo Bearbeite Datei fuer move %%~nxi 
13.
			move "%Pfad%\%%~nxi" "%Pfadprint%" >nul 
14.
15.
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.ä.)
--> außerdem habe ich die IF ERRORLEVEL 1-Prüfung abgekürzt durch die gleichbedeutende "|| goto tryAgain". Ist nur andere syntax, kein anderer Sinn.
--> 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

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
Bitte warten ..
Mitglied: KeiosID
05.12.2009 um 16:11 Uhr
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
Bitte warten ..
Mitglied: KeiosID
08.12.2009 um 10:46 Uhr
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:

01.
set "counter=0" 
02.
set "maxcount=10" 
03.
set "Pfad=C:\Streamserve\spoolcitrix" 
04.
set "PfadA=C:\Streamserve\spoolcitrix\AboOut00*.*" 
05.
set "PfadB=C:\Streamserve\spoolcitrix\AboZePlt*.*" 
06.
set "PfadC=C:\Streamserve\spoolcitrix\AboZeBnd*.*" 
07.
set "PfadD=C:\Streamserve\spoolcitrix\eds_*.*" 
08.
set "Pfadprint=\\sedemune0044\Streamserve\Print\Adware\Versandunterlagen" 
09.
set "Pfadraw=\\sedemune0044\Streamserve\save\Adware\raw" 
10.
set "Pfadeds=\\sprdc01\transportmedia$\Prod\Exportlisten" 
11.
 
12.
:start 
13.
	rem Etiketten und Chechire 
14.
:Etiketten 
15.
		if not exist "%PfadA%" goto Palettenleitzettel 
16.
		 
17.
		for %%i in ("%PfadA%") do ( 
18.
			echo Bearbeite Datei fuer copy %%~nxi 
19.
			copy "%Pfad%\%%~nxi" "%Pfadraw%" 
20.
			IF ERRORLEVEL 1 goto Etiketten** 
21.
			echo Bearbeite Datei fuer move %%~nxi 
22.
			move "%Pfad%\%%~nxi" "%Pfadprint%"  
23.
24.
	 
25.
 
26.
**:Palettenleitzettel** 
27.
		rem Palettenleitzettel 
28.
		if not exist "%PfadB%" goto Bundzettel 
29.
		for %%i in ("%PfadB%") do ( 
30.
			echo Bearbeite Datei fuer copy %%~nxi 
31.
			copy "%Pfad%\%%~nxi" "%Pfadraw%" 
32.
			IF ERRORLEVEL 1 goto Palettenleitzettel 
33.
			echo Bearbeite Datei fuer move %%~nxi 
34.
			move "%Pfad%\%%~nxi" "%Pfadprint%"  
35.
36.
 
37.
:Bundzettel 
38.
	rem Bundzettel 
39.
						 
40.
		if not exist "%PfadC%" goto Versandlisten 
41.
		for %%i in ("%PfadC%") do ( 
42.
			echo Bearbeite Datei fuer copy %%~nxi 
43.
			copy "%Pfad%\%%~nxi" "%Pfadraw%" 
44.
			IF ERRORLEVEL 1 goto Bundzettel 
45.
			echo Bearbeite Datei fuer move %%~nxi 
46.
			move "%Pfad%\%%~nxi" "%Pfadprint%"  
47.
48.
			 
49.
:Versandlisten 
50.
	rem Versandlisten 
51.
						 
52.
		if not exist "%PfadD%" goto Ende 
53.
		for %%i in ("%PfadD%") do ( 
54.
			echo Bearbeite Datei fuer copy %%~nxi 
55.
			copy "%Pfad%\%%~nxi" "%Pfadraw%" 
56.
			if ERRORLEVEL 1 goto Versandlisten 
57.
			echo Bearbeite Datei fuer move %%~nxi 
58.
			move "%Pfad%\%%~nxi" "%Pfadeds%"  
59.
60.
				 
61.
:Ende 
62.
pause pause4 
63.
set /a counter=%counter% + 1 
64.
if "%counter%" NEQ "%maxcount%" goto start 
65.
 
66.
echo Filemove_Versandunterlagen_SpoolCitrix_to_Print.bat gelaufen am %date% um %time% >> c:\Batch\Spoolcitrix.txt  
67.
pause 
68.
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
Bitte warten ..
Mitglied: Biber
08.12.2009 um 20:07 Uhr
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
Bitte warten ..
Mitglied: KeiosID
09.12.2009 um 13:07 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

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

Frage von Floh21 zum Thema Outlook & Mail ...

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

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...