Jump to content

Batchprogrammierung (Zeit-Ausgabe am Bildschirm)


Gast
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo.

Ich bin auf der Suche nach einer Lösung.

Ich möchte die Zeit am Bildschirm ausgeben, wobei die "neue"-Zeit immer die vorherige Zeit-Ausgabe überschreibt. (also in einer Schleife).

Die Zeit-Ausgabe soll zuerst vor dem Beginn eines Copy-Befehls anfangen in einer Schleife zu laufen, und wenn der Copy Befehl seine Aufgabe beendet hat, dann soll die neue Zeit (nach dem Copy) wieder ausgegeben werden.

Ist das möglich zu programmieren?

Danke im Voraus.

Adenium

Link zu diesem Kommentar

Nein, wollte ich nicht neu erfinden, denn ich benutze bereits den Robocopy.

Ich wollte wissen wie lang der Robocopy benötigt und deswegen die Lösung mit der Zeit.

Die Robocopy-Zusammenfassung gefällt mir nicht so sehr.

Analog zu der Robocopy-Prozent-Anzeige, will ich eine Zeit-Anzeige, die immer auf der selben Stelle ausgegeben wird.

Weißt du wie man das programmieren kann?

Danke.

 

Link zu diesem Kommentar

Was für eine Zeitverschwendung.  ;-)   ... aber als Fingerübung vielleicht ganz nett.

Zitat

Analog zu der Robocopy-Prozent-Anzeige, will ich eine Zeit-Anzeige, die immer auf der selben Stelle ausgegeben wird.

Du könntest robocopy in ein Log schreiben lassen und dieses periodisch lesen/parsen und Dir die Informationen entsprechend Deiner Vorlieben aufbereiten. Du kannst z.B. Write-Host anweisen, keine neue Zeile anzufangen. In einer Schleife steht das dann immer in der gleichen Zeile wenn Du manuell einen "Cariage Return" nach jeder Zeile einfügst.  Oder Du kannst mittels Escape-Sequenzen die Ausgabe Zeilen- und Spalten-genau ausgeben. Oder Du könntest Write-Progress verwenden - das wird automatisch oben am Konsolen-Fenster positioniert - da brauchst Du nix tricksen.

Zitat

Die Robocopy-Zusammenfassung gefällt mir nicht so sehr.

... siehe oben ;-)  ... Du liest die gewünschten Informationen aus dem Log und bereitest sie entsprechend Deiner Vorlieben auf.

vor 4 Stunden schrieb Nobbyaushb:

Es gibt eine GUI für Robocopy, muss den link mal suchen

Ist das nicht nur dazu da, die zahlreichen und zum Teil cryptischen Optionen zusammenzuklicken?

 

robocopy GUI 

 

Eine andere Alternative wäre noch RichCopy ...  https://docs.microsoft.com/en-us/previous-versions/technet-magazine/dd547088(v=msdn.10)?redirectedfrom=MSDN

bearbeitet von BOfH_666
Link zu diesem Kommentar

Ich danke Euch für die Benennung von alternativen Copy-Programmen.

Mir geht es jedoch nicht um den Copy-Befehl, sondern um die Zeit-Anzeige am Bildschirm.

Ich könnte anstatt des Copy-Befehls auch jede andere beliebige Anweisung verwenden.

Ich würde gern wissen wie man das mit den vorhandenen DOS-Befehlen programmieren soll.

Vielen Dank

Adenium 

Link zu diesem Kommentar

Moin,

 

solche Dinge kann man mit der PowerShell viel besser erledigen. Da gibt es eigene Funktionen für Fortschrittsanzeigen.

 

Ansonsten findet man Batch-Tricks im Web sehr gut über naheliegende Suchbegriffe. Mit "batch echo overwrite" bin ich in Sekunden zu diesen Lösungen gekommen:

https://stackoverflow.com/questions/45381482/windows-echo-to-overwrite-previous-echo

 

Gruß, Nils

 

Link zu diesem Kommentar
vor 4 Stunden schrieb Adenium:

Ich würde gern wissen wie man das mit den vorhandenen DOS-Befehlen programmieren soll.

Oooops ... ich hatte angenommen, dass es hier um Powershell ginge, sorry. Naja, Nils hat Dich ja schon in die richtige Richtung geschubst. ;-)  ... und wenn Du's doch mal mit etwas Modernerem und vor Allem einfacher zu Schreibenden versuchen willst, schaust Du Dir mal das Powershell cmdlet Write-Progress an. 

 

Das sieht dann ungefähr so aus, wie in diesem Video: 

 

 

... was dort ausgegeben wird, kannst Du selbst festlegen. Es muss also keine Prozentzahl sein. ;-)  Schau Dir einfach mal die Hilfe an und spiel ein bissl mit den Beispielen.

 

 

Viel Spaß 

Link zu diesem Kommentar

@BOfH_666 Das sieht recht interessant aus. Auf  jeden Fall danke ich dir. Kann man eigentlich in ein BAT-Programm auch Powershell Befehle einbetten? und wie bringt man das Programm dann zur Ausführung? hab ich noch nie vorher gemacht.

@NilsK Das war ein guter "Schubs". Jetzt fange ich an mich mit Hilfe der Beispiele, an das Problem zu nähern. Wenn ich aus dem rufenden Programm ein Anderes, mit Hilfe des Call-Befehls aufrufe, werden das die beiden Programme (Rufer & Aufgerufener), parallel oder sequenziell ausgeführt? Zunächst möchte ich mich auch bei dir herzlich bedanken.

 

Link zu diesem Kommentar
vor 1 Stunde schrieb Adenium:

@BOfH_666 Das sieht recht interessant aus. Auf  jeden Fall danke ich dir. Kann man eigentlich in ein BAT-Programm auch Powershell Befehle einbetten? und wie bringt man das Programm dann zur Ausführung? hab ich noch nie vorher gemacht.

@NilsK Das war ein guter "Schubs". Jetzt fange ich an mich mit Hilfe der Beispiele, an das Problem zu nähern. Wenn ich aus dem rufenden Programm ein Anderes, mit Hilfe des Call-Befehls aufrufe, werden das die beiden Programme (Rufer & Aufgerufener), parallel oder sequenziell ausgeführt? Zunächst möchte ich mich auch bei dir herzlich bedanken.

 

Hmmm ... es ist nicht so richtig der Focus dieses Forums, Dir iterativ das Scripten beizubringen.  ;-) Das sind alles Anfängerfragen, die Dir ein gutes Buch, ein Anfänger-Online-Tutorial oder ein Video-Kurs in den ersten Kapiteln beibringt.  Ich empfehle immer gern den hier: Getting Started with PowerShell 3.0. Da werden Dir die Grundlagen vom Erfinder beigebracht. Ein guter Startpunkt ist auch hier: Getting Started with Windows PowerShell 

 

Powershell ist neuer. Daher ist es einfacher "alte" cmd-Befehle in Powershell zu benutzen als andersrum. Die meisten laufen ohne jegliche Anpassung auch unter Powershell.  Es gibt verschiedene Methoden "externe" Programme aus der Powershell heraus zu starten. Und man kann beeinflussen, ob das Script auf die Beendigung des externen Programms wartet, oder einfach asynchron (parallel) weiter läuft.

 

Am Besten, Du fängst erstmal an ein bissl zu basteln und wenn Du dann mit einem konkreten Stück Code nicht weiterkommst, kannst Du hier wieder fragen. Wir können üblicherweise viele besser helfen, wenn wir etwas zum "Handanlegen" haben.  ;-)

Link zu diesem Kommentar

"Fortschrittsanzeige" und "Zeit" sind 2 verschiedene Dinge. Die meisten User sind in der Lage, eine Uhrzeit zu lesen:

 

SCNR :-)

Persönlich bin ich ein absoluter Fan der Progress Bars, wenn Skripte viele Objekte bearbeiten und ich also auch etwas habe, das ich halbwegs zuverlässig zählen kann. Das mit "zuverlässig zählen" ist auch der Grund dafür, daß in Windows viele Progress Bars auf "endlos" umgestellt wurden. "Ja es passsiert noch was, aber wir wissen nicht wie lange es dauert".

Link zu diesem Kommentar

Ich glaube ja, wenn der Kollege Adenium erstmal merkt, wie aufwändig das wird, so eine Anzeige hinzubekommen, dass ihm dann die existierende robocopy Fortschritts-Anzeige gleich viel besser gefällt.  ;-)

 

Vielleicht bringt's ja auch sowas hier ... da bekommt man dann wenigstens die aktuelle Zeit immer in der Konsole angezeigt und auch wie lange der letzte Befehl zur Ausführung brauchte ... und es sieht cool aus

 

 

Link zu diesem Kommentar

Hallo und danke an alle, die bislang geantwortet haben.

Der Kollege BOfH_666 hat irgendwie Recht mit seiner Annahme, dass ich mich. A la Long, mit den Eigenschaften von Robocopy zufrieden geben werde.

Ich schildere mal die Problematik, so wie ich sie sehe (vereinfacht erklärt):

Wenn ich 3 Befehle untereinander codiere, z.B.

echo %time%

robocopy ....

echo %time%

Dann werden die 3 Befehle sequentiell ausgeführt. Das heißt, wenn der Robocopy sagen wir mal 10 Min. lang läuft, dann wird der zweite Echo-Befehl erst nach den 10 Min. des Robocopy ausgegeben.

 

Was ich ursprünglich wollte, war jedoch eine sich wiederholende Zeit-Ausgabe (in das selbe Fenster) während der Robocopy läuft.

Das bedeutet, dass 2 Programme gleichzeitig laufen müssen:

Prog1 müsste sich um die Schleife der sekundlich ausgegebenen Zeit-Displays kümmern, aber es  müsste auch das Prog2, in dem sich der Robocopy befinden müsste, aufrufen.

In Prog2 müsste auch ein Indikator auf 1 gesetzt werden bis der Robocopy zu Ende ist. Danach müsste der Indikator auf "0" gesetzt werden.

Da die beiden Programme parallel laufen würden, könnte den Indikator in Prog1 (innerhalb der Zeit-Schleife) jedesmal geprüft werden.

Soweit ich alles verstanden habe, würde sich der "CALL"-Befehl nicht eignen, da die Sequenz der aufgerufenen Befehle, sequentiell ausgeführt werden. Anstatt eines CALLs, könnte man auch einen START benutzen, aber dieser würde in einem separaten Fenster ausgeführt.

Ich denke, ich sollte mich von meiner o.g. Idee verabschieden.

Sollte jemand von Euch jedoch eine andere Idee haben, dann bin ich natürlich Offen.

Danke an Alle für das Mitdenken.

Adenium

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...