Progressbar über die Dauer einer aktiven CMD-Session ausgeben

  • Hallo,

    mit dem Befehl:

    Code
    ; Verzeichnis auslesen, unter index.txt im @workingdir abspeichern, cmd-Fenster dabei verbergen;
    Run(@ComSpec & ' /c ' & 'dir /n /os /4 /s > index.txt' & '"', "", @SW_HIDE)

    erstelle ich mir eine simple txt mit den angegebenen Parametern von "dir"

    Frage:
    Könnt ihr mir bitte helfen, dass eine möglichst genaue Processbar für die Dauer der aktiven CMD-Session visualisiert wird, da der Erstellungsprozess der txt mit meinen benötigten Parameter im Netz oft länger dauert, als ich schätze.

  • Die Frage ist, wieso du nicht EINFACH per AutoIt (das ist übrigens die Programmiersprache, in dessen Forenbereich wir uns hier befinden) die Dateien in eine Textdatei schreibst. Dafür gibt es reihenweise Funktionen...such mal nach rekursiv filelist
    Wenn du diese Funktion gefunden hast, ist die Progressbar nur noch ein weiterer Einzeiler.

    da der Erstellungsprozess der txt mit meinen benötigten Parameter im Netz oft länger dauert, als ich schätze.

    Die Textdatei ist in Millisekunden erstellt! Das was "dauert" ist die Zeit, übers Netzwerk die Dateien zusammenzusuchen.
    Weiterhin solltest du vorher (!) wenigstens näherungsweise festlegen, wie viele Dateien in etwa gesucht werden. Ob du nun den Maximalwert der Progressbar bei 80% oder 120% der entgültigen Dateianzahl festlegst, ist imho unerheblich.

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (29. April 2015 um 16:38)

  • Herzlichen Dank für die schnelle Antwort
    Leider kommt bei mir beim Aufruf zum Link des Downloads der angegebenen Seite folgende Meldung:

    Code
    The page you requested does not exist

    Die Beispiele sehen sehr interessant aus. Verfügst Du über einen Direktlink zum Aufruf?

  • 1. Wenn du diese Funktion gefunden hast, ist die Progressbar nur noch ein weiterer Einzeiler.


    2. Weiterhin solltest du vorher (!) wenigstens näherungsweise festlegen, wie viele Dateien in etwa gesucht werden. Ob du nun den Maximalwert der Progressbar bei 80% oder 120% der entgültigen Dateianzahl festlegst, ist imho unerheblich.

    Zu 1: Das hört sich auch sehr interessant an. Könntest Du mir bitte vielleicht ein Beispiel anhand meines Vorhabens nennen?

    Zu 2: Die Abfragen können vorab nicht einmal näherungsweise festgelegt werden. Leider. Die Abfragen sind in Unterverzeichnissen auf letzter Ebene nötig als auch oft in übergeordneten Verzeichnissen mit bis zu hundert Unterverzeichnissen.

    Mir würde aber auch schon eine Meldung "Bitte warten" ausreichen. Eben über die Dauer solange die CMD-Session arbeitet.
    Es soll wirklich ganz einfach, so einfach wie möglich gestrickt sein. Wobei eine Processbar eine tolle Sache wäre.

  • Das wäre vielleicht eine Möglichkeit, muss aber eventuell noch etwas angepasst werden.

    Wenn ein Ordner mehrmals durchsucht wird benützt diese Funktion die vorherige Zeit, sollte keine Zeit zu dem Ordner abgespeichert worden sein zeigt sie nur ein "Geschätzte Dauer: Unbekannt" an.

    Edit: klappt natürlich nur wenn sich die Ordnergröße nicht völlig ändert und es nur eine Begrenzte anzahl an Ordnern gibt.

  • UEZ: Der Link funktioniert wieder. Ich habe allerdings wieder einmal als komplett-Doofi keine ahnung, wie ich den Code von z. B. _GDIPlus_DrawingText.au3 in eine Funktion bringen kann. Ich bräuchte ein Beispiel oder bezahlte Nachhilfestunden in Stuttgart um das ganze Lauffähig zu bekommen. Vielen Dank für Deine Hilfe.

    Zeitriss: Dir auch herzlichen Dank für den schon angepassten Code. Das ist für mich gerade ein Segen gewesen und hilft mir echt gut weiter.
    Ich habe Deinen Code bei mir eingefügt und festgestellt, dass nach einer einmaligen Indexizierung die Progressbar tadellos funktioniert.
    Mein Problem dabei ist, dass wir eine Menge an Netzlaufwerken haben, welche im Grunde vorab auf oberster Ebene indexiziert werden müssten, damit bei der Abfrage der Balken erscheint. Gibt es denn eine Möglichkeit, die Netzlaufwerke vorab zu indexizieren.

    Ich habe es versucht mit:

    Code
    Global Const $g_sIniPath = "Index.ini"
    CreateIndex("F:\, G:\, H:\, S:\, X:\")

    Doch das ging leider in die Hose. ;(

  • Was du machen kannst, ist eine Art Wartebildschirm anzuzeigen, dass der Prozess noch läuft oder seit x Sekunden läuft. Dazu kannst du die Progress* Funktionen benutzen (siehe Hilfe)

    Hallo,

    sorry für den Doppelpost. Welchen progress parameter muss ich benutzen, dass ich eine Art Wartebildschirm angezeigt bekomme solange der cmd.exe prozess läuft. Ich komme ohne Hilfe nicht weiter.

  • AutoIt
    Global $PIDProcess = Run(@ComSpec & ' /c ' & 'dir /n /os /4 /s > index.txt' & '"', "", @SW_HIDE)
    ProgressOn("Indexierung","Index wird erstellt","Bitte haben Sie einen Moment geduld.") ; Erstellt ein Progress Fenster
    While ProcessExists($PIDProcess)
    	ProgressSet(50) ; Setzt den Progress Balken auf die angegebene Prozentzahl
    	sleep(50)
    Wend
    ProgressOff() ; Schließt das Progress Fenster

    So würdest du ein Progress Fenster anzeigen welches solange dableibt wie die CMD.exe läuft.
    Der Balken steht jedoch still, da wir den Fortschritt nicht kennen, ich habe ihn auf 50 Prozent gesetzt. (Die ProgressSet() Funktion in der Schleife ist nicht notwendig, solange der Balken sich nicht bewegen soll.)


    Edit: Zu deiner Frage oben, ob man Laufwerke vorher indexieren kann:

    Es ist möglich alle Ordner vorher zu Indexieren aber sehr langwierig, ich glaube das ist etwas zu aufwendig nur für eine Zeitanzeige. :thumbup:

    Einmal editiert, zuletzt von Zeitriss (29. April 2015 um 21:38)

  • Hab' vielen Dank. Das klappt hervorragend. Könntest Du mir dennoch ein Beispiel mit einer Messagebox geben? Wäre klasse.

    edit: Und so ein Balken, der sich die ganze Zeit wie eine Gif-Animation bewegt (siehe Post 2 von UEZ) wäre als Beispiel für micch natürlich auch ganz toll.

    Für alle aber zunächst mal: Vielen Dank für die Hilfe. Vor allem an Zeitriss, der mir heute Abend SUPER weitergeholfen hat. :thumbup:
    Es ist nicht einfach, sich in die Funktionen einzuarbeiten. Vielleicht stelle ich mich auch doof an und kapier es einfach nicht. Ich habe heute in 5 Stunden nicht das zusammengebracht, was mir Zeitriss eben gepostet hat. Mit einem Beispiel ist das einfacher zu lernen. Für mich jedenfalls.

    Einmal editiert, zuletzt von bazii (29. April 2015 um 22:02) aus folgendem Grund: edit:

  • Schön dass es dir geholfen hat. :)

    Meist du die MsgBox() Funktion? Ich sehe kein wirklichen Sinn darin die in diesem Fall zu benützen, da sie das Script blockiert (zumindest Standardmäßig) und nicht Aktualisierbar ist, oder verstehe ich dich grade falsch? ?(

  • Nein, Du hast vollkommen recht.

    Seit dem ich die MsgBox() Funktionen aus dem Skript genommen habe, funkt das Script Dank Deiner Hilfe logischer Weise wesentlich schneller. Vielen Dank nochmals.
    Jetzt kann ich morgen an die Arbeit gehen und muss nicht immer den "taskmgr" im Auge haben, ob die cmd fertig ist.

    Klasse Arbeit!

  • Hab' vielen Dank. Das klappt hervorragend. Könntest Du mir dennoch ein Beispiel mit einer Messagebox geben? Wäre klasse.

    edit: Und so ein Balken, der sich die ganze Zeit wie eine Gif-Animation bewegt (siehe Post 2 von UEZ) wäre als Beispiel für micch natürlich auch ganz toll.

    Für alle aber zunächst mal: Vielen Dank für die Hilfe. Vor allem an Zeitriss, der mir heute Abend SUPER weitergeholfen hat. :thumbup:
    Es ist nicht einfach, sich in die Funktionen einzuarbeiten. Vielleicht stelle ich mich auch doof an und kapier es einfach nicht. Ich habe heute in 5 Stunden nicht das zusammengebracht, was mir Zeitriss eben gepostet hat. Mit einem Beispiel ist das einfacher zu lernen. Für mich jedenfalls.

    Welche Animation hättest du gerne? Die mit den Prozentangaben macht deinem Fall keinen Sinn.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • UEZ: Vielen Dank, das würde mich sehr freuen wenn Du hier ein Beispiel posten könntest. Es würde sicher, viele Suchende sehr nützlich sein.

    Ich finde die hier ganz toll:

    1. _GDIPlus_SpinningAndGlowing.au3 (thanks to Eukalyptus)
    2. _GDIPlus_GlowingText.au3 (thanks to Eukalyptus)
    3. _GDIPlus_LoadingSpinner.au3
    4. _GDIPlus_SimpleLoadingAnim.au3

  • Probiere es mal damit:

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hallo UEZ,

    ich habe mir nicht vorstellen können, dass und vor allem wie jemand sowas tolles hinbekommen kann.
    Das einzige, was ich am Code verändert habe ist das Arbeitsverzeichis, weil dies stets wechselt.

    Code
    RunWait(@ComSpec & ' /c ' & 'dir /n /os /4 /s > index.txt' & '"', "", @WorkingDir, @SW_HIDE)

    Dein Code wird somit nach meinen Bedürfnissen sauber und unglaublich schnell abgearbeitet.

    Herzlichen Dank dafür!

  • Ich habe noch eine Frage.

    Wir schaffe ich es, aus dem Beispiel _GDIPlus_LoadingSpinner.au3 beziehungsweise nach diesem Code, die Animation zeitgleich der Indexfertigstellung zu beenden?


  • Einfach die Schleife nach dem Run Befehl

    [autoit]

    Do
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    GUIRegisterMsg($WM_TIMER, "")
    _WinAPI_DeleteObject($hHBmp_BG)
    _GDIPlus_Shutdown()
    GUIDelete()
    Exit
    EndSwitch
    Until False

    [/autoit]

    durch

    [autoit]


    GUIRegisterMsg($WM_TIMER, "")
    _WinAPI_DeleteObject($hHBmp_BG)
    _GDIPlus_Shutdown()
    GUIDelete()
    Exit

    [/autoit]


    ersetzen.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯