ShelExecution und @HIDE

  • Hallo allerseits,

    ich habe eine Function um einen Ordner zu synchronisieren mit Robocopy, mir gelingt es einfach nicht das CMD Fenster mit ,@Hide zu unterdrücken, weiss jemand an welche Stelle es hier eingebaut werden muss? Ohne Hide funktionietr bei mir folgender Aufruf:

    AutoIt
    ;Syncro()
    
    Func Syncro()
       $usbdb_dir = 'C:\windows\system32\robocopy.exe'
       $source = 'c:\plc'
       $destination = 'f:\plc1'
    
    ShellExecuteWait($usbdb_dir, $source & ' "' & $destination & '"' & ' /E /Z /MIR /R:3 /W:5 /XD ' & '>nul 2>&1' & '"' & $source & 'Recycled\' & '" "' & $source & 'Recycler\' & '" "' & $source & 'System Volume Information\' & '"')
    EndFunc

    Ich weiss, es gibt wahrscheinlich bessere Methoden es direkt in Autoit zu machen, da ich aber in AutoIt noch am Anfang stehe soll mir diese Quick und dirty Lösung erst mal genügen.


    lg


    Chris

  • mir gelingt es einfach nicht das CMD Fenster mit ,@Hide zu unterdrücken, weiss jemand an welche Stelle es hier eingebaut werden muss?

    Das @Hide gibt es gar nicht!

    Du solltest mehr in die Hilfe sehen. ShellExecute(Wait) kennt @SW_HIDE als fünften Parameter.

    Dementsprechend müsste das so aussehen:

    Übergabeparameter sollte man mit Stringformat zusammensetzen. So kann man Fehler leichter erkennen.

  • Hallo Oscar,

    vielen Dank für die Antwort, habe das jetzt so übernommen, wie gesagt der String ohne SW_Hide funktionierte so, aber hier ist noch der Wurm drin, es kommt zwar kein CMD Fennster aber er macht ebenso wenig :(

    lg


    chris

  • Hallo casi4712 ,

    hier mal eine Kombination aus dem was Oscar vorgeschlagen hat und einer alten Funktion "_runProgram()" zum Aufruf eines externen Programmes:

    Bitte beachte:

    • Im Beispielcode ist Zeile 9 aktiv (nicht auskommentiert). Du bekommst nur den Aufruf von "_runProgram()" mit Parametern in der Console ausgegeben.
    • Wenn du stattdessen Zeile 10 aktivierst, dann wird dein Aufruf wirklich ausgeführt, mit sichtbaren CMD Fenster und es wird gewartet bis du CMD manuell schließt.
    • Wenn du stattdessen Zeile 11 aktivierst, dann wird dein Aufruf ebenfalls ausgeführt, aber unsichtbar und CMD wird automatisch nach Programmausführung geschlossen.

    Also schaue dir erstmal die Consolenausgabe an, ob deine Parameter so stimmen würden, wenn du Robocopy manuell über CMD ausführen würdest 😉 .

    Viele Grüße

    Sven

  • hallo Solve,

    danke erstmal für deinen Code. Puh, ganz schöne Menge Code für eine Kopieraktion, aber versteh dass natürlich, wenn man schon einen Fremdbefehl aufruft, über dessen Code ja letzlich nichts bekannt ist.

    lg und schönen Sonntag noch

  • Wenn Dein Originalcode funktioniert, hänge doch erst einmal die fehlenden Parameter an:

    AutoIt
    ShellExecuteWait($usbdb_dir, $source & ' "' & $destination & '"' & ' /E /Z /MIR /R:3 /W:5 /XD ' & '>nul 2>&1' & '"' & $source & 'Recycled\' & '" "' & $source & 'Recycler\' & '" "' & $source & 'System Volume Information\' & '"', "", "", @SW_HIDE)

    Und wenn das nicht funktioniert, steckt der Wurm im Original. Wenn doch, schau Dir mal in Ruhe die Lösung von Oscar an und versuche, die Unterschiede/Fehler zu finden.

  • ich denke das Problem liegt schon in den Aufurfparametern für Robocopy...

    an dieser Stelle

    Code
    >nul 2>&1

    ist doch die Geschichte für Robocopy zu Ende und der Rest ist irrelevant. ^^

    Man sollte erstmal erforschen, was der Threadersteller mit dem Robocopy Befehl überhaupt kopieren will.

    Ansonsten ist Oscar's Vorschlag genau das was du suchst.

    Code
    ShellExecuteWait($usbdb_dir, $params, "", "", @SW_HIDE)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Hi casi4712 ,

    Puh, ganz schöne Menge Code für eine Kopieraktion [...]

    Die Funktion _runProgram() erscheint recht überladen für einen trivialen Aufruf von ShellExecuteWait(), dies muss ich zugeben, ja. Musst du für deinen Fall auch gar nicht verwenden sondern einfach das Beispiel von Oscar nutzen 😉 . Die Funktion _runProgram() ist einfach etwas robuster wenn es um andere Laufwerke/Partitionen geht ... aber egal.

    [...] das Problem liegt schon in den Aufurfparametern für Robocopy [...]

    Darauf wollte ich hinaus mit meiner Aussage:

    Also schaue dir erstmal die Consolenausgabe an, ob deine Parameter so stimmen würden, wenn du Robocopy manuell über CMD ausführen würdest 😉 .

    Tipp:

    • Nutzt du SciTE oder VSCode als Editor casi4712 ? Falls nicht tue dies unbedingt. Allein das Syntax highlighting sollte dir einige potenzielle Probleme zeigen können.
    • Anonsten STRG+F5 immer mal zwischendurch ausführen und schauen was der "Check" in der Console ausgibt.
    • Helfen würde es uns auch, wenn du den Consolen-Output bei Fehlern hier postest, dann geht es evtl. noch schneller/genauer.

    Viele Grüße

    Sven

  • hallo erstmal und danke,

    @VE ja ich hatte den Parameter @SW_HIDE angehängt, hatte den code so jetzt hier vergessenzu posten, mein Fehler, aber dass eben geht nicht. Da macht er nichts.

    Schnuffel: das hier funktioniert,


    danke noch mal

    und schönen Sonntag

    AutoIt
    Syncro()
    
    Func Syncro()
       $usbdb_dir = 'C:\windows\system32\robocopy.exe'
       $source = 'c:\plc'
       $destination = 'c:\plc1'
    
    ShellExecuteWait($usbdb_dir, $source & ' "' & $destination & '"' & ' /E /Z /MIR /R:3 /W:5 /XD ' & '"' & $source & 'Recycled\' & '" "' & $source & 'Recycler\' & '" "' & $source & 'System Volume Information\' & '"', "", "", @SW_HIDE)
    EndFunc

    Einmal editiert, zuletzt von casi4712 (30. Januar 2022 um 13:42)

  • Hi nochmal,

    was genau bekommst du denn angezeigt wenn du CMD öffnest und Robocopy einfach manuell mit deinen ganzen Parametern mal aufrufst?
    Wenn dort der Fehler liegt, was Schnuffel festgestellt hat, dann wirst du mit deinem AutoIt Aufruf auch nichts bekommen.
    Daher bitte erst den Robocopy Aufruf manuell lauffähig bekommen, dann in AutoIt einbinden 😉 .

    Viele Grüße
    Sven

  • Kleine Ergänzung:

    Wenn Du in Deinem ursprünglich eingestellten Code ShellExecuteWait() durch MsgBox() ersetzt:

    Code
    MsgBox(0, $usbdb_dir, $source & ' "' & $destination & '"' & ' /E /Z /MIR /R:3 /W:5 /XD ' & '>nul 2>&1' & '"' & $source & 'Recycled\' & '" "' & $source & 'Recycler\' & '" "' & $source & 'System Volume Information\' & '"')

    zeigt die Box folgenden Parameterstring für RoboCopy an:

    Code
    c:\plc "f:\plc1" /E /Z /MIR /R:3 /W:5 /XD >nul 2>&1"c:\plcRecycled\" "c:\plcRecycler\" "c:\plcSystem Volume Information\"

    Das solltest Du mal im CMD-Fenster probieren, falls Dir nicht vorher schon Fehler auffallen.

  • Hi casi4712 ,

    in meinen post #4 habe ich den fehlenden Backslash bereits hinzugefügt gehabt, dies scheint dir nicht aufgefallen zu sein, naja.

    Darum schreibt Schnuffel und Velted bzgl. Konsolenausgabe, message box und wir fragen nach Editor und Ausführung. usw. => dient also alles in Richtung Umgang mit AutoIt und Editor, nicht mal dem Code selbst 😉 .



    In deinem ersten post schreibst du:

    [...] ich habe eine Function um einen Ordner zu synchronisieren mit Robocopy [...]

    Dann lass uns doch mal anders herangehen:
    Was heißt synchronisieren für dich? Willst du "Ordner-A" und dessen Inhalt einfach nur in "Ordner-B" an anderer Stelle kopieren oder brauchst du tatsächlich Robocopy?

    Viele Grüße

    Sven

  • Bezüglich dem Notepad++, hat der Probleme mit Autoit Code?

    JA.

    Notepad++ ist ohne Zweifel ein sehr guter Editor und deshalb hatte ich vor über 10 Jahren mal angefangen ihn für AutoIt fit zumachen (Notepad++ und AutoIt).

    Letztlich habe ich es aber nicht weiter verfolgt, da eine m.M.n. wesentliche Funktion nicht vollständig verfügbar ist: Der Lexer kann nur eine begrenzte Anzahl von Keywords verarbeiten.

    Und inzwischen habe ich all das, was NP++ an Features SciTE voraus hatte, durch entsprechende Lua-Skripte auch für SciTE verfügbar gemacht. Ich möchte sogar behaupten, dass die Funktionsvielfalt von SciTE inzwischen die von NP++ übersteigt.

    Daher klare Empfehlung für Editor (meist benutzte):

    1. SciTE4AutoIt
    2. ISN AutoIt Studio
    3. VSCodium / Visual Studio Code

    Es gibt noch weitere Editoren, die gut mit AutoIt umgehen können, aber die vorgenannten besitzen, soweit ich weiß, die größte Vielfalt.

  • Hi BugFix ,

    Danke für die klare und wichtige Erläuterung bzw. Empfehlung 👍 .
    Meine präferierte Editorwahl kennst du ja 😁 , tut hier aber nichts zur Sache.

    Viele Grüße
    Sven

  • wie gesagt, ja der Robocopy Befehl funktioniert bis

    Code
    >nul 2>&1

    Aber danach ist alles irrelevant und wird verworfen.

    Da du aber anscheinend nicht bereit bist dich mit den gemachten Hilfen aueinanderzusetzen bin ich raus ;)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • doch bin ich, und ich bin auch dankbar für diese Information, ich setze mich immer mit allem auseinander, auch wenn ich leider zeitlich etwas startk eingespannt bin, aber schade dass du diese Meinung hast Schnuffel, woher willst Du wissen, dass ich mnich nicht mit Die auseinandersetze ?

    Danke noch mal an alle für die entsprechenden Hilfestellungen, Mein Script funktioniert jetzt soweit, wie es soll, Eine kleine Frage hätte ich jdoch noch, ich denke sollte nur ne Kleinigkeit sein, weshalb ich das hier gleich anhänge.

    Ich lese mit dem Befehl RegRead bestimmte Werte aus der Rgistry aus, diesen Befehl finde ich klasse, leider funktioniert der Befehl nicht ganz logisch. Beispiel;

    Code
    Global $WinName = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName")
    
    MsgBox(0,"Info", $WinName)

    Dieses funktionierte von Anfang an nicht ganz richtig, als au3 zeigte er Mit Windows Enterprise an, in dem entsprechenden Key steht aber Windows Pro. Und es ist definiotiv Pro. IN kompilierter Form hat er es dann richtig gemacht. Seit neuestem zeigt er nur noch Enterprise an. Kennt jemand diesen Effekt?


    lg

    und schönen Sonntag noch

    chris

  • JA habe ich,, und das ist mir durchaus bewusst. Die Frage war ja auch vielmehr ist diese Dieskrepanz im Ergebnis, bei der Ausführung des au3 und des kompilierten x64 Exe in irgendeiner Form logisch erklärbar?

  • es gibt bei der Installation von autoit eine Abfrage, ob Scripte im x86 oder x64 Mode gestartet werden sollen.

    Entsprechend werden bestimmte Variablen gesetzt. Dies betrifft auch die Zweige der Registry.

    Ich vermute mal du startest deine Scripte in Scite im x86 Mode und compilierst sie dann im x64 Mode.

    Zumindest ist das die Einzige Erklärung die mir spontan einfällt.

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)