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
Kommentar vom Moderator Biber am 03.02.2012 um 18:45:42 Uhr
Auf "Hinreichend beantwortet" gesetzt.
GELÖST

Batch mit Fortschrittsanzeige

Frage Entwicklung Batch & Shell

Mitglied: imebro

imebro (Level 2) - Jetzt verbinden

29.01.2012, aktualisiert 03.02.2012, 7123 Aufrufe, 25 Kommentare

Hallo,

ich habe nun schon mehrere Threads über das Thema gelesen und auch eine Batch erzeugt.
Ein kleiner Teil fehlt mir aber noch.
Vielleicht könnt Ihr mir helfen.

Die hier unten einkopierte Batch macht folgendes:

1) notepad.exe wird geöffnet
2) gleichzeitig beginnt eine Schleife, worin ein Fortschrittsbalken aus roten #-Zeichen beginnt zu laufen
3) während dessen wird eine Datei "test.txt" auf den Desktop kopiert
3) dieser Balken läuft so lange, bis ich die notepad.exe manuell schließe
4) am Ende erscheint eine Erfolgsmeldung "KOPIEREN ERFOLGREICH BEENDET!"

Ich möchte aber nun folgendes erreichen:

1) der Kopiervorgang soll nach dem Start der Batch durch einen Tastendruck beginnen
2) dann erst soll der Lauf der Fortschrittsbalken beginnen und die notepad.exe soll sich (möglichst minimiert) öffnen
3) während des Kopierens soll der Balken weiter laufen
3) sobald der Kopiervorgang abgeschlossen ist, soll notepad.exe automatisch geschlossen werden
4) nun soll die Erfolgsmeldung "KOPIEREN ERFOLGREICH BEENDET!" erscheinen und die Batch soll mit "pause > nul" beendet werden.

01.
@echo off &setlocal 
02.
color 0c 
03.
 
04.
:: *Notepad als Beispiel für einen Fortschrittsbalken: 
05.
start "" "notepad.exe" 
06.
 
07.
:: *Schleife laufen, bis Prozess sichtbar ist 
08.
:loop1 
09.
 
10.
:: Beginn Kopiervorgang - vielleicht besser an einer anderen Stelle der Batch??? 
11.
copy c:\TEST22.txt C:\Users\imebro\Desktop>nul 
12.
 
13.
tasklist /nh /fi "imagename eq notepad.exe" 2>&1|findstr /b /i /l /c:"notepad.exe">nul &&goto loop2 
14.
ping -n 1 localhost>nul 
15.
goto loop1 
16.
 
17.
:: *Schleife laufen und Balkenzeichen malen, bis Notepad geschlossen ist 
18.
:loop2 
19.
<nul set /p "=#" 
20.
tasklist /nh /fi "imagename eq notepad.exe" 2>&1|findstr /b /i /l /c:"notepad.exe">nul ||goto ahead 
21.
ping -n 2 localhost>nul 
22.
goto loop2 
23.
:ahead 
24.
 
25.
echo. 
26.
echo. 
27.
echo KOPIEREN ERFOLGREICH BEENDET! 
28.
echo. 
29.
echo. 
30.
pause > nul
Hat jemand von Euch eine Idee?

Danke schon jetzt für Eure Hilfe.

Schöne Grüße,
imebro
Mitglied: AndreasHoster
30.01.2012 um 12:29 Uhr
Ich persönliche finde ja, sowas per Batch zu lösen grenzt an Masochismus, aber wer will darf sich ruhig selber quälen.
1) der Kopiervorgang soll nach dem Start der Batch durch einen Tastendruck beginnen
Wie wäre es mit dem Befehl pause?
3) während des Kopierens soll der Balken weiter laufen
Dann solltest Du nicht innerhalb der Batch den copy Job starten, der blockiert die Batch nämlich bis er fertig ist.
Wie wäre es mit start zu arbeiten und damit den copy Job in eine weitere Task zu starten?
2) dann erst soll der Lauf der Fortschrittsbalken beginnen und die notepad.exe soll sich (möglichst minimiert) öffnen
3) sobald der Kopiervorgang abgeschlossen ist, soll notepad.exe automatisch geschlossen werden
Weshalb den Notepad?
Starte doch als Kopierjob xcopy und frage in Tasklist xcopy ab, obs noch läuft.
Wenn jemand den Editor öffen hat, weil er was sehen will, tut Deine Idee nämlich nicht mehr.
Und falls Du das Problem eines parallel laufenden xcopy umgehen willst, mach eine Kopie von xcopy, nenne es xcopy_meineKopie, ruf das auf und frage mit Tasklist diesen neuen Namen ab.
Bitte warten ..
Mitglied: imebro
30.01.2012 um 13:32 Uhr
Hallo und danke für Deine Ausführungen,

wie genau müßte ich das umsetzen?
--> mit start arbeiten und den copy Job in einer weiteren Tast starten

ebenso ist mir nicht klar, wie ich den Kopierjob (xcopy) per Tasklist abfragen soll (ob´s noch läuft).

Vielleicht kannst Du diese beiden Dinge ja mal in meine Datei (siehe oben) einflicken

Die obige Datei ist nur als Beispiel gedacht. Der Start und das Beenden von "notepad.exe" dienten lediglich dazu,
Beginn und Ende des Fortschrittsbalkens beeinflussen zu können... da soll dann stattdessen der Kopiervorgang ausgelagert werden,
wenn ich Dich richtig verstanden habe...?

Im Grunde geht es darum, eine vorhandene Batch, mit der ich regelmäßig einen bestimmten Kopierjob erledige, so anzupassen,
dass mir ein Fortschrittsbalken angezeigt wird, der so lange laufen soll, bis der Kopiervorgang beendet ist.

Also:
- Batchdatei starten
- Beginnen mit Dateien kopieren von A -> nach B
- mit Start des Kopiervorgangs erscheint der Fortschrittsbalken
- wenn der Kopiervorgang zu Ende ist, soll der Fortschrittsbalken enden
- Ausgabe des Hinweises "Erfolgreich beendet"
- Batchdatei Ende!

Danke und schöne Grüße,
imebro
Bitte warten ..
Mitglied: imebro
30.01.2012 um 14:15 Uhr
Habe eben nochmal überlegt und vielleicht würde es ja auch so gehen:

1) Batch Nr. 1 „Fortschrittsbalken“ starten mit „sleep 3“ (damit der Balken erst startet, wenn der Kopiervorgang schon begonnen hat).
2) Mit Befehl CALL die Batch Nr. 2 „meine Sicherungsdatei“ starten
.....Batch Nr. 1 (Hauptdatei) läuft weiter inkl. Fortschrittsbalken...
3) sobald Batch Nr. 2 „meine Sicherungsdatei“ zu Ende ist, wird wieder an Batch Nr. 1 „Fortschrittsbalken“ übergeben
4) Batch Nr. 1 „Fortschrittsbalken“ wird dann beendet mit den „Erfolgreich-kopiert-Meldungen...“ etc.
5) start der LOG-Datei --> ENDE

Andersrum würde auch gehen, wenn man aus der Hauptdatei (dann „meine Sicherungsdatei“) die durch CALL aufgerufene Datei „Fortschrittsbalken“ beenden kann...

Wäre das ggf. eine Möglichkeit?

Wenn ja, wäre es schön, wenn jemand von Euch meine obige Datei mal so anpassen könnte.

Danke & Gruss,
imebro
Bitte warten ..
Mitglied: AndreasHoster
30.01.2012 um 14:27 Uhr
Du bekommst es hin, mit tasklist nach Notepad abzufragen, aber eine Abfrage nach xcopy nicht?
Dann ist die obige Batch wohl auch nicht aus Deiner Feder, oder?

Hier mal eine neue Version
01.
@echo off &setlocal 
02.
color 0c 
03.
 
04.
:: Es soll ja erstmal gewartet werden 
05.
pause > nul 
06.
 
07.
:: *Schleife laufen, bis Prozess sichtbar ist 
08.
:loop1 
09.
 
10.
:: Beginn Kopiervorgang - vielleicht besser an einer anderen Stelle der Batch??? 
11.
start "Kopieren" /min xcopy.exe c:\TEST22.txt C:\Users\imebro\Desktop\ > nul 
12.
 
13.
tasklist /nh /fi "imagename eq xcopy.exe" 2>&1|findstr /b /i /l /c:"xcopy.exe">nul &&goto loop2 
14.
ping -n 1 localhost>nul 
15.
goto loop1 
16.
 
17.
:: *Schleife laufen und Balkenzeichen malen, bis Notepad geschlossen ist 
18.
:loop2 
19.
<nul set /p "=#" 
20.
tasklist /nh /fi "imagename eq xcopy.exe" 2>&1|findstr /b /i /l /c:"xcopy.exe">nul ||goto ahead 
21.
ping -n 2 localhost>nul 
22.
goto loop2 
23.
:ahead 
24.
 
25.
echo. 
26.
echo. 
27.
echo KOPIEREN ERFOLGREICH BEENDET! 
28.
echo. 
29.
echo. 
30.
pause > nul
Hat allerdings zwei grundlegende Probleme:
1. Solange irgendein XCOPY läuft (auch ein anderes) zählt er weiter, daß könnte man, wie oben schon geschrieben, mit einer Kopie des xcopy Programms mit einem eindeutigen Namen umgehen.
2. Falls durch einen Fehler xcopy sich beendet, bevor der tasklist Befehl in Zeile 13 gelaufen ist, hängst Du in einer Endlosschleife.
Bitte warten ..
Mitglied: pieh-ejdsch
30.01.2012 um 14:33 Uhr
moin Imebro,

also ohne viel hin oder her bzw Taskman prüfungen
wie auch in dem Thread: .bat Aufruf mittels angeschlossenen Taster soll nur genau 1x erfolgen

geht völlig ohne extra CMD Contex; aber der Log lässt sich nur in so einem Contex führen.

01.
@echo off &setlocal 
02.
 
03.
set "File=%temp%\xcopyLogFile%random%" 
04.
 
05.
start "" /min Xcopy /y "D:\Eine Datei" "D:\Neuer Ordner" >"%File%" 
06.
 
07.
echo Kopieren hat begonnen! 
08.
 
09.
:Test 
10.
<nul set/p=# 
11.
(echo( >"%File%") 2>nul || (ping localhost -n 2 1>nul &&goto :Test) 
12.
 
13.
echo( 
14.
echo( 
15.
echo( 
16.
echo Kopieren ist Fertig! 
17.
echo( 
18.
echo( 
19.
pause 
20.
goto :eof
Bitte warten ..
Mitglied: imebro
30.01.2012 um 15:03 Uhr
Hallo und danke für die schnellen Antworten.

  • ja, die obige Datei stammt nur zum Teil aus meiner Feder... den Rest habe ich aus einem anderen Thread kopiert.

Werde die Möglichkeiten später zu Hause mal testen und bin schon gespannt.

Die von mir angesprochene Möglichkeit mit dem Aufruf einer weiteren Batch durch CALL, würde mir auch nicht ganz so gut gefallen, da dann ggf. 2 Fenster offen wären.
Es sei denn, man könnte die Hauptdatei (die Dateien kopiert) sofort nach Start der Balken-Datei minimieren und nach dem Kopiervorgang und beenden der Balken-Datei die Hauptdatei wieder maximieren und bis zum Ende abarbeiten.

Das wäre noch eine Alternative.
Aber zunächst werde ich mal Eure Varianten testen.

Danke und schöne Grüße,
imebro
Bitte warten ..
Mitglied: imebro
30.01.2012 um 15:52 Uhr
Hallo...

...konnte es jetzt doch nicht abwarten
Habe mit einem Dummy-Kopiervorgang getestet (150 MB großes Verzeichnis von C:\ nach D:\ kopiert).

Das Beispiel von "Andreas Hoster" hat funktioniert.

Habe aber die Angabe zum warten ganz oben (pause > nul) raus genommen.
Dann startet der Fortschrittsbalken sofort und endet, sobald sich das minimierte Kopierfenster automatisch geschlossen hat.

Perfekt bis dahin!!!

Nun muss ich das alles noch in meine bestehende Kopier-Batch zu Hause einsetzen... mal sehen, wie ich das hinbekomme.

Danke nochmals und schöne Grüße,
imebro
Bitte warten ..
Mitglied: imebro
31.01.2012 um 08:28 Uhr
Hallo nochmal,

im Grunde läuft die Datei gut.
Allerdings gibt es noch ein Problem, welches ich nicht so ganz verstehe... bzw. nicht lösen kann.

Ich habe Euch dazu hier mal meine komplette Kopier-Batch-Datei eingesetzt, damit Ihr mir (hoffentlich) bei der Lösung helfen könnt.

Nochmal zur Info:

Im Grunde sichert die Datei nur die auf meiner Festplatte gesicherten Daten automatisch auf die externe Festplatte. Natürlich ist das "Spielerei", aber wenn es klappt, würde ich das Ganze gerne noch weiter ausbauen. Ohne die Zusätze bezüglich "Fortschrittsbalken" (siehe innerhalb der per REM-Befehl mit Strichen (----) markierten Bereiche) funktioniert die Datei einwandfrei!!

Hier der Code:

01.
@ echo off 
02.
title BACKUP 
03.
 
04.
REM Kopieren der Backupdateien von G:\Backup auf externe Festplatte 
05.
echo. 
06.
echo. 
07.
echo. 
08.
echo.           ***************************************************************** 
09.
echo.           *                                                               * 
10.
echo.           *                   Aktualisieren des BACKUPS                   * 
11.
echo.           *                                                               * 
12.
echo.           *               Laufwerk G --> Externe Festplatte               * 
13.
echo.           *                                                               * 
14.
echo.           *          --- nur veraenderte Daten werden kopiert ---         * 
15.
echo.           *                                                               * 
16.
echo.           ***************************************************************** 
17.
echo. 
18.
echo.                                 (c) imebro 2012 
19.
echo. 
20.
echo. 
21.
echo. 
22.
echo.           ***************************************************************** 
23.
echo.           * Zuerst die externe FP anschliessen! - Weiter mit Tastendruck! * 
24.
echo.           ***************************************************************** 
25.
 
26.
pause > nul 
27.
echo. 
28.
echo. 
29.
echo. 
30.
 
31.
CHOICE /C JN /M ".     Kopiervorgang beginnen?" 
32.
if errorlevel 2 goto ENDE 
33.
if errorlevel 1 goto WEITER 
34.
 
35.
:WEITER 
36.
 
37.
C:\Windows\sleep.exe 2 
38.
 
39.
echo. 
40.
echo. 
41.
echo.           ************************************** 
42.
echo.           * Der Kopiervorgang wurde gestartet! * 
43.
echo.           ************************************** 
44.
echo. 
45.
 
46.
C:\Windows\sleep.exe 2 
47.
 
48.
REM --------------------------------------------------------------------------------------------------- 
49.
REM *Schleife laufen lassen, bis Prozess sichtbar ist 
50.
:loop1 
51.
 
52.
start "Kopieren" /min xcopy.exe G:\Backup-imebro I:\Backup-imebro /D /F /R /S /Y 1>c:\LOG_BATCH.LOG 2>&1 
53.
REM ---------------------------------------------------------------------------------------------------- 
54.
 
55.
 
56.
REM -------------------------------------------------------------------------------------------------- 
57.
tasklist /nh /fi "imagename eq xcopy.exe" 2>&1|findstr /b /i /l /c:"xcopy.exe">nul &&goto loop2 
58.
ping -n 1 localhost>nul 
59.
goto loop1 
60.
 
61.
REM *Schleife laufen lassen und Balkenzeichen malen, bis kopieren zu Ende ist 
62.
:loop2 
63.
<nul set /p "=#" 
64.
tasklist /nh /fi "imagename eq xcopy.exe" 2>&1|findstr /b /i /l /c:"xcopy.exe">nul ||goto ahead 
65.
ping -n 2 localhost>nul 
66.
goto loop2 
67.
:ahead 
68.
REM --------------------------------------------------------------------------------------------------- 
69.
 
70.
echo. 
71.
echo. 
72.
if errorlevel 4 goto SYNTAX 
73.
if errorlevel 1 goto FEHLER 
74.
if errorlevel 0 goto ERFOLG 
75.
 
76.
echo. 
77.
echo. 
78.
echo. 
79.
 
80.
:SYNTAX 
81.
echo.      Ungueltiges Laufwerk oder Syntax! - Programm mit Tastendruck beenden! 
82.
 
83.
pause > nul 
84.
goto ENDE 
85.
 
86.
:FEHLER 
87.
echo.      Keine Dateien zum kopieren gefunden! - Programm mit Tastendruck beenden! 
88.
 
89.
pause > nul 
90.
goto ENDE 
91.
 
92.
:ERFOLG 
93.
echo.           ********************************************************** 
94.
echo.           * Das Backup auf der ext. Festplatte wurde aktualisiert! * 
95.
echo.           ********************************************************** 
96.
echo. 
97.
echo. 
98.
echo. 
99.
echo.      Programm mit Tastendruck beenden - Zielverzeichnis und LOG wird geoeffnet 
100.
 
101.
pause > nul 
102.
 
103.
start I:\Backup-imebro 
104.
start C:\LOG_BATCH.LOG 
105.
 
106.
:ENDE
Folgendes passiert bei der Ausführung:

Es erscheint folgende Fehlermeldung (Zeile Nr. 87) aus der Batch (siehe Errorlevel):

„Keine Dateien zum kopieren gefunden! - Programm mit Tastendruck beenden!“

Ich vermute, dass das Problem innerhalb der per REM-Befehl mit Strichen (----) markierten Bereiche liegt.
Ggf. müßten die Zeilen Nr. 57 und 64 angepaßt werden, da dort nur "2>&" steht.
Wenn ich jedoch die Angaben aus dem Kopiervorgang in Zeile Nr. 52 dort einsetze (1>c:\LOG_BATCH.LOG 2>&1), dann erhalte ich die oben angegebene Fehlermeldung.

Was mache ich falsch?

Vielen Dank und schöne Grüße,
imebro
Bitte warten ..
Mitglied: AndreasHoster
31.01.2012 um 14:54 Uhr
Das Problem liegt in mangelndem Verständnis.

Die Errorlevel-Abfrage ist für die Katz.
Was willst Du damit denn abfragen? Vermutlich den Wert den XCOPY zurückgibt, aber den wirst Du nie bekommen, da XCOPY in einer separaten Batch läuft.
Du fragst den letzten Befehl vor Errorlevel ab, nämlich findstr. Und der ist immer 1, ansonsten würdest Du ja nicht aus der Schleife rausfliegen.

Wenn Du schon wissen willst, ob xcopy richtig lief, dann solltest Du die Log Datei parsen, die Du erzeugst.
Bitte warten ..
Mitglied: imebro
31.01.2012 um 15:17 Uhr
Hallo und danke für Deine weitere Hilfe.

Bedeutet das, dass ich den kompletten Errorlevel-Bereich (Zeilen Nr. 72 - 87) entfernen soll?

Und... muss ich - wie in meinem letzten Posting geschrieben - auch die Zeilen Nr. 52, 57 und 64 so anpassen, damit auch eine LOG-Datei erstellt wird oder kann das Alles so bleiben, wie es jetzt ist?

Vielen Dank & schöne Grüße,
imebro
Bitte warten ..
Mitglied: pieh-ejdsch
31.01.2012 um 15:47 Uhr
moin,

Zeile 52:
01.
start "Kopieren" /min xcopy.exe G:\Backup-imebro I:\Backup-imebro /D /F /R /S /Y 1>c:\LOG_BATCH.LOG 2>&1 
das wird Dir niemals einen Log schreiben


Zitat von pieh-ejdsch:
geht völlig ohne extra CMD Contex; aber der Log lässt sich nur in so einem Contex führen.

Dann schreib Deine Log Zeile anders wenn Du sie auswerten willst:
01.
start "Kopieren" /min cmd /c "xcopy.exe G:\Backup-imebro I:\Backup-imebro /D /F /R /S /Y 1>c:\LOG_BATCH.LOG 2>&1" 
Deine Chronologischen Meldungen sind nicht ganz passend.
erst gibst Du die Meldung Kopiervorgang wurde gestartet
und danach startest Du und weisst nicht ob es Starten konnte.

Gruß Phil
Bitte warten ..
Mitglied: imebro
31.01.2012 um 20:12 Uhr
Hallo Phil,

danke Dir für Deine Tipps.

Habe es eben so umgestellt... auch die Error-Zeilen gelöscht... und es funktioniert prima!!

Ich habe auch die Meldung "Kopiervorgang gestartet" jetzt NACH dem Beginn des Kopierens eingesetzt

Aber 3 Fragen hätte ich noch:

1) Geht es, dass der Fortschrittsbalken nicht ganz links in der Ecke beginnt sondern etwas weiter nach rechts?

2) Kann man die Farbe des Fortschrittsbalkens (nur dessen Farbe!!) verändern?

3) Kann man die Geschwindigkeit des Fortschrittsbalkens verändern? Dass also z.B. mehr der "#"-Zeichen in kürzerer Zeit angezeigt werden?


Danke und schöne Grüße,
imebro
Bitte warten ..
Mitglied: Biber
31.01.2012 um 21:59 Uhr
Moin imebro,

Zitat von imebro:
Aber 3 Fragen hätte ich noch:
Hmmm, du weisst aber, dass dieses "Einen hab ich noch"-Nachkanten nicht sehr beliebt ist bei einigen der hier ansässigen Hilfsmoderatoren?

1) Geht es, dass der Fortschrittsbalken nicht ganz links in der Ecke beginnt sondern etwas weiter nach rechts?
Nein, nicht wirklich. Nur mit unsauberen Tricks, die den ernsthaften Eindruck deines Arbeits- und Gebrauchsbätsches mindern.
Wozu also?

2) Kann man die Farbe des Fortschrittsbalkens (nur dessen Farbe!!) verändern?
Ja... mit dem Befehl COLOR (siehe color /? am CMD-Prompt)

3) Kann man die Geschwindigkeit des Fortschrittsbalkens verändern? Dass also z.B. mehr der "#"-Zeichen in kürzerer Zeit angezeigt werden?
Ja , durch Verkürzen der Wartezeit (statt "ping -n 2" halt nur ping -n 1") oder noch kürzer mit "sleep.exe" oder ähnlichem.
Viel simpler allerdings ist es, jeweils zwei oder drei '-Zeichen pro Aufruf malen zu lassen
<nul set /p "=###" 
Grüße
Biber
Bitte warten ..
Mitglied: pieh-ejdsch
31.01.2012 um 22:04 Uhr
moin imebro,

zu 1. setz einen Punkt vor den Freiraum und dann set /p... ist im Script angezeigt
zu 2. nur eine Zeile ---> Nein
zu drittens ja den wait verändern

das mit den Meldungen hab ich noch etwas Geordnet
Bei Abbruch kommt eine entsprechende Meldung und die Errormeldungen sind sofort ablesbar.

Praktischerweise ist es eine bessereArt Tee zu verwenden Vergleichbar mit Batch - mit und ohne tee - Konsoleausgaben zugleich in eine Datei leiten und auf dem Bildschirm ausgeben
nur noch mit zusätzen

Du kannst den Hauptbach auch abbrechen - eine Zweite instanz wird an der stelle weiter Anzeigen
Die Xcopy Batch kann auch abgebrochen werden und es ist sofort nachlesbar im Hauptbatch.

01.
@ echo off &setlocal 
02.
title BACKUP 
03.
set "prompt=$g" 
04.
::echo on 
05.
 
06.
 rem ----- Einstellungen 
07.
 
08.
set             "LogFile=D:\LOG_BATCH.LOG" 
09.
set              "Quelle=D:\Eingang" 
10.
set                "Ziel=D:\Backup\" 
11.
set                 Wait=2 
12.
set              "FTitel=Backup wird zurzeit Durchgefuehrt" 
13.
set /a  x  =  1  ,  ax  = 60 
14.
 
15.
 rem -----LetzteMeldungAnzeigen und je 2 doppelpunkte davor 
16.
 
17.
   set       "NICHT_Anzeigen=1>nul" 
18.
:: set "NICHT_FehlerAnzeigen=3>nul" 
19.
 
20.
 rem ----- Ende Einstellungen 
21.
 
22.
23.
if not defined LogFile echo          LogFile nicht definiert&pause&goto :eof 
24.
if not defined Quelle (echo          Quelle nicht definiert&pause&goto :eof) else if not exist "%Quelle%" echo          Quelle: "%Quelle%" nicht gefunden&pause&goto :eof 
25.
if not defined ziel echo          Ziel nicht definiert&pause&goto :eof 
26.
)>&2 
27.
for %%i in (%LogFile%) do type nul >"%%~dpitest.log" &&del "%%~dpitest.log" ||(echo          LogFile kann nicht geschrieben werden! Kontrollieren!&pause&goto :eof)>&2 
28.
 
29.
 rem sucht nach Bevorzugter Wartefunktion 
30.
"C:\Windows\sleep.exe" 1 2>nul >&2 && set "Warte=2>nul >&2 "C:\Windows\sleep.exe" " || waitfor 2>&1 |find "FEHLER:" >nul && set "Warte=2>nul >&2 Waitfor x /t " || set "Warte=2>nul >&2 ping localhost -n " 
31.
 
32.
set "LogName=%Quelle%--%ziel%" 
33.
set "OrigLog=%LogFile%" 
34.
:Logname 
35.
for /f "tokens=1*delims=\:*?" %%i in ("%Logname%") do if "%%i" neq "%Logname%" set "Logname=%%i_%%j" & goto :Logname 
36.
for %%i in ("%LogFile%") do set "Logfile=%%~dpni_%Logname%%%~xi" 
37.
set "Last=0" 
38.
for %%i in ("%LogFile%") do set "LastBUtime=%%~ti" &if exist %%i (set "BStatus=1") else set "BStatus=" 
39.
 
40.
 rem LetzteMeldungAnzeigen 
41.
%NICHT_Anzeigen% %NICHT_FehlerAnzeigen% ( 
42.
(<"%LogFile%" find "Datei(en) kopiert") 2>nul >&2 && (echo(&echo(         Letzte Backup Meldung^(en^): %LastBUtime%&<%LogFile% find "Datei(en) kopiert" &set "Abort=") || set "Abort=1" 
43.
for /f "tokens=1*delims=:" %%i in (' 
44.
 findstr /r /c:"Syntaxfehler." /c:"Datei .* nicht gefunden" /c:"Datei kann nicht auf sich selbst kopiert werden" /c:"Unzul„ssige Parameteranzahl" /c:"Ungltige Laufwerkangabe" /c:"Kopiervorgang konnte nicht gestartet werden!" /c:"Der Befehl .* ist entweder falsch geschrieben" /c:"konnte nicht gefunden werden." "%LogFile%"  2^>nul ^|findstr /n "^"  
45.
') do (set "Abort=1"&if %%i equ 1 (echo(&echo(         Letzte Backup Fehler!-meldung^(en^):&echo(%%j) else echo(%%j)>&3 
46.
47.
 rem laeuft das Backup bereits? 
48.
(type nul >>%LogFile%)2>nul ||(echo(&echo          Backup ist noch in Arbeit!&(for /f %%i in (' find /v /c "" ^<"%LogFile%" ') do set /a Last=%%i&for /f %%i in (' find /v /c "?" ^<"%LogFile%" ') do echo          ca. %%i Dateien Kopiert.) 2>nul &goto :TimeOutError) 
49.
 
50.
 REM Kopieren der Backupdateien von "%Quelle%" auf externe Festplatte 
51.
52.
echo. 
53.
echo. 
54.
echo. 
55.
echo.         ***************************************************************** 
56.
echo.         *                                                               * 
57.
echo.         *                   Aktualisieren des BACKUPS                   * 
58.
echo.         *                                                               * 
59.
echo.         *               Laufwerk G --^> Externe Festplatte               *  
60.
echo.         *                                                               * 
61.
echo.         *          --- nur veraenderte Daten werden kopiert ---         * 
62.
echo.         *                                                               * 
63.
echo.         ***************************************************************** 
64.
echo. 
65.
echo.                                 ^(c^) imebro 2012 
66.
echo. 
67.
68.
if defined Abort ( 
69.
echo. 
70.
echo. 
71.
if defined BStatus (echo          !!!  %LastBUtime% - Das Backup wurde abgebrochen!   !!! 
72.
) else              echo          ***  !!!  Hinweis, letzter Backup-Log- nicht vorhanden!  !!!  *** 
73.
echo. 
74.
echo. 
75.
76.
:IsOnline 
77.
for %%i in ("%Ziel%") do if not exist %%~di ( 
78.
echo. 
79.
echo. 
80.
echo.         ***************************************************************** 
81.
echo.         * Zuerst die externe FP anschliessen! - Weiter mit Tastendruck! * 
82.
echo.         ***************************************************************** 
83.
pause > nul 
84.
goto :IsOnline 
85.
86.
echo. 
87.
echo. 
88.
echo. 
89.
 
90.
CHOICE /C JN /M ".        Kopiervorgang beginnen?" 
91.
if errorlevel 2 goto :eof 
92.
del "%LogFile%" 2>nul 
93.
echo(&echo( 
94.
 
95.
 rem -----Monitoring-------Rest vom xcopy eventuell Anpassen-------------------------------------- 
96.
 
97.
start "%FTitel%" /min cmd /c " copy "%Quelle%" "%ziel%" /Fridys 1>"%LogFile%" 2>&1" 
98.
 
99.
 rem -----Ende Monitoring------------------------------------------------------------------------- 
100.
 
101.
:TimeOutError 
102.
 
103.
 rem Marke TimeOutError -  
104.
if not defined TimeOutError set "TimeOutError=20" 
105.
if %TimeOutError% gtr 10 if not exist "%LogFile%" (set/a "TimeOutError-=1") else set "TimeOutError=10" 
106.
%warte%1 
107.
if %TimeOutError% gtr 10 goto :TimeOutError 
108.
if %TimeOutError% neq 0 (for /f %%i in (' find /v /c "" ^<"%LogFile%" ') do if %%i equ 0 set /a TimeOutError -=1 &goto :TimeOutError)2>nul || (>"%LogFile%" echo LogFile wurde nicht beschrieben. Kopiervorgang konnte nicht gestartet werden!) 
109.
if %last% gtr 3 (set /a "lastMessage=last-3") else set /a "lastMessage=0" 
110.
set "error=" 
111.
findstr /r /c:"Syntaxfehler." /c:"Datei .* nicht gefunden" /c:"Datei kann nicht auf sich selbst kopiert werden" /c:"Unzul„ssige Parameteranzahl" /c:"Ungltige Laufwerkangabe" /c:"Kopiervorgang konnte nicht gestartet werden!" /c:"Der Befehl .* ist entweder falsch geschrieben" /c:"konnte nicht gefunden werden." "%LogFile%" >&2  && ( 
112.
echo. 
113.
echo.         * !!! Das Backup konnte nicht gestartet werden. Fehler!!!* 
114.
echo. 
115.
echo. 
116.
echo. 
117.
echo. 
118.
set "error=1" 
119.
goto :no 
120.
) || ( 
121.
echo. 
122.
echo. 
123.
echo.         ************************************** 
124.
echo.         * Der Kopiervorgang wurde gestartet! * 
125.
echo.         ************************************** 
126.
echo. 
127.
128.
 
129.
:Loop2 
130.
 
131.
::echo on 
132.
 rem ----- 
133.
134.
for /f "%skip% tokens=1* delims=:" %%i in ('findstr /n "^" "%LogFile%" 2^>nul') do ( 
135.
	set /a last=%%i 
136.
	set "Inputstream=" 
137.
	  rem Logfile 
138.
	if %last% lss %%i echo(%%j 
139.
))>>"%OrigLog%"  
140.
 
141.
 rem -----EingabeMeldungen Anzeigen 
142.
for /f "tokens=1* delims=:" %%i in ('findstr /n /r /c:"^Ist das Ziel .* ein Dateiname" /c:"^oder ein Verzeichnisname" /c:".*? [^]." "%LogFile%" 2^>nul') do if %lastmessage% lss %%i ( 
143.
	set /a lastMessage=%%i 
144.
	if not defined Inputstream echo(&echo(Achtung! Eine Eingabe wird erwartet.&echo Best„tige im Fenster "%FTitel%" laut dieser Anfrage:&echo( 
145.
	echo(    %%j 
146.
	set /a "x=1" 
147.
	set "Inputstream=goto :Loop2" 
148.
149.
%warte%%wait% 
150.
if %last% neq 0 set "skip=skip=%last%" 
151.
 
152.
 rem -----FileToBeCopiedSign-oder-Monitoring Ende---- 
153.
(type nul >>"%LogFile%")2>nul || (%Inputstream% 
154.
	set /a "x-=1", y=1/x 2>nul || ( 
155.
	echo(&set/p"=.        "<nul& set /a "x=ax") 
156.
	set/p"=#"<nul 
157.
	goto :Loop2 
158.
159.
 
160.
 rem -----enthaelt der Log die Letzte Zeile? 
161.
for /f %%i in ('find /v /c "" ^<"%LogFile%"') do if %%i neq %last% goto :Loop2 
162.
 
163.
find "Datei(en) kopiert" <"%LogFile%" >nul && ( 
164.
REM --------------------------------------------------------------------------------------------------- 
165.
echo. 
166.
echo. 
167.
echo. 
168.
echo.         ********************************************************** 
169.
echo.         * Das Backup auf der ext. Festplatte wurde aktualisiert! * 
170.
echo.         ********************************************************** 
171.
echo. 
172.
echo. 
173.
echo. 
174.
) || ( 
175.
echo. 
176.
echo.  
177.
echo. 
178.
echo. 
179.
echo.         *** !!!  Das Backup ist nicht vollst„ndig. Fehler  !!! *** 
180.
echo. 
181.
echo. 
182.
echo. 
183.
echo. 
184.
set "error=1" 
185.
186.
:no 
187.
find "Datei(en) kopiert" <"%LogFile%"  
188.
if defined error (pause) else %warte%5 
189.
:List 
190.
if %last% gtr 2 start notepad "%LogFile%"
Wenn das Ziel ohne Backslash ist und nicht vorhanden, dann erfolgt eine Nachfrage im minimierten Fenster.
zusätzlich gibt es noch den Parameter /i dafür im xCopy

[Edit]
Logschriebs, ErrorTimeOut und Fehleranzeige vervollständigt.
zuletzt 3/2/12-13:42
[/Edit]

Gruß Phil
Bitte warten ..
Mitglied: imebro
01.02.2012 um 10:38 Uhr
Hallo Phil,

danke für Deine Mühe... ist ja unfassbar, was Du aus meiner Ursprungs-Batch gemacht hast

Habe sie soeben mal getestet. Allerdings hier an meinem Büro-PC.
Dazu habe ich die Verzeichnisse so angelegt, wie in Deinen Einstellungen definiert.

Die Batch bricht sofort ab, nachdem die Anzeige "Aktualisieren des BACKUPS - nur veraenderte Daten werden kopiert" erschienen ist.
Ich konnte das nur feststellen, nachdem ich in die Batch testweise ein pause eingefügt hatte, damit sie dort stehen bleibt und ich sehen kann, wo genau das ist.
Komisch ist, dass die Zeile mit "Laufwerk G --> Externe Festplatte" innerhalb der ersten Meldung fehlt...

Nach dem Abbruch wird eine undefinierbare Datei mit dem Namen "Externe" erstellt. Wenn ich diese mit dem Editor öffne, steht dort folgendes:

* Laufwerk G -- Festplatte *

Dabei fällt mir auf, dass das Zeichen ">" von dem Pfeil nach rechts fehlt.
Der Fehler hat sicher damit zu tun, dass genau diese Zeile auch in der ersten Meldung fehlt (wie ich eben ja schon beschrieben habe).

Ich konnte da aber keinen Fehler ermitteln.

Hast Du eine Idee?

Danke und schöne Grüße,
imebro
Bitte warten ..
Mitglied: bastla
01.02.2012 um 12:16 Uhr
Hallo imebro!

Abgesehen davon, dass Dein Fortschrittsbalken keinen Fortschritt im eigentlich Sinn anzeigt, sondern nur für etwas Action sorgt, sollte Dir die Tatsache, dass eine Datei erstellt wurde, schon den richtigen Hinweis gegeben haben; falls doch noch nicht:

> erzeugt in Batch eine Ausgabeumleitung, wenn es nicht "escaped" wird ...
echo.         *               Laufwerk G --^> Externe Festplatte               *
Grüße
bastla
Bitte warten ..
Mitglied: imebro
01.02.2012 um 12:33 Uhr
Hallo bastla,

danke für Deinen Tipp.

Merkwürdig ist jedoch, dass diese Zeile in meiner Ursprungsdatei genauso aussah und dennoch funktioniert hat.
Aber ich habe das "^-Zeichen" jetzt dort eingesetzt.

Dennoch bricht die Batch genau an der gleichen Stelle ab... nur wird jetzt keine Datei "Externe" mehr erzeugt...

Weißt Du noch einen Rat?

Danke & Gruss,
imebro
Bitte warten ..
Mitglied: pieh-ejdsch
01.02.2012 um 20:45 Uhr
moin Imebro,

auf Bastlas Hinweis hab ich auch die Klammern vom (c) maskiert.
Bei mir läuft der Batch durch und sämtliche wenn ich alle erwischt habe Meldungen werden Durchgereicht, Auch zu erwartende Eingaben werden Angezeigt (die müssen allerdings im richtigen Fenster eingegeben werden).

Falls bei Dir Fehler Auftreten dann starte den Batch seperat im einer Extra CMD-Box und schalte ein Echo on in die Batch.

Gruß Phil
Bitte warten ..
Mitglied: imebro
01.02.2012 um 22:23 Uhr
Hallo Phil,

ganz großen Dank an Dich!!

Die Batch läuft grds. gut durch.

Allerdings wird gleich im ersten Fenster auch die Angabe "Hinweis, letztes Backup wurde abgebrochen" angezeigt.
Da hat sich sicher noch ein kleiner Fehler eingeschlichen...

Weiterhin sieht man auf dem folgenden Bild, dass der Fortschrittsbalken plötzlich in die nächste Zeile wechselt.
Außerdem wird die LOG-Ausgabe direkt in das Ausführungsfenster geschrieben. Lieber wäre es mir, wenn sich einfach am Schluss nur das Logfile öffnet (was ja auch funktioniert). Die zusätzliche Ausgabe im Fenster kann ruhig weg bleiben.

http://www.bilder-hochladen.net/files/j98v-1-c4ca-jpg.html

Vielen Dank bis dahin und schöne Grüße,
imebro
Bitte warten ..
Mitglied: pieh-ejdsch
02.02.2012 um 00:28 Uhr
moin imebro,

Den Hinweis habe ich Korrigiert.
Der Haupt -Log wird weiterhin auch vollgeschrieben (aber nur wenn der Anzeige Batch läuft).
Sonst wird der direkte xcopy Log nur für den Ablauf des Monitoring benutzt.

Den Copy Balken habe ich etwas reingesetzt und Hinten abgeschnitten (Varaible: ax ).

Bei Fehlern pausiert der Batch wie gehabt.
Das öffnen des Log habe ich im Ergebnis unter 3 Zeilen unterbunden.

Gruß Phil
Bitte warten ..
Mitglied: LordXearo
02.02.2012 um 10:22 Uhr
Hallo zusammen,

habe das Thema nur überflogen und falls es noch nicht erwähnt wurde.

Powershell bietet einen richtigen Fortschrittsbalken. Vielleicht bietet das für dich einen richtigen Mehrwert, wenn du dich dort einarbeitest.

Gruß

Xearo
Bitte warten ..
Mitglied: imebro
02.02.2012 um 10:58 Uhr
Hallo Phil,

danke für die Änderungen.

Werde die Datei heute Abend (schon gespannt...) testen und dann berichten.

Schöne Grüße,
imebro
Bitte warten ..
Mitglied: imebro
02.02.2012 um 22:04 Uhr
So... habe eben getestet.

Die Batch läuft gut durch.

Nur bin ich mir nicht sicher, warum nach dem Start als erstes ganz oben die folgende Meldung erscheint:

"Letzte Backup Meldung(en):
5 Datei(en) kopiert"

Soll das so sein oder was hat es damit auf sich?

In jedem Fall mal wieder vielen, vielen Dank an PHIL!!

Schöne Grüße,
imebro
Bitte warten ..
Mitglied: pieh-ejdsch
03.02.2012 um 13:51 Uhr
moin,

Für ein Backup ist es doch erwähnenswert ob es Erfolgreich war. Finde ich.
Ist doch von Vorteil ob die letzte Backup Meldung ein/kein Fehler war bzw. was der Fehler war.

Schau mal Zeile 15 an.

Gruß Phil
Bitte warten ..
Mitglied: imebro
03.02.2012 um 14:11 Uhr
Hallo Phil,

ja, da hast Du Recht!
Hab ich gar nicht drüber nachgedacht.

Also... die Batchdatei funktioniert super und ist genial ausgetüftelt

Danke Dir für Deine Mühe und wünsche Dir ein super schönes Wochenende.


Schöne Grüße,
imebro
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (9)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

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

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

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

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

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...