Super, Problem gelöst, es lag am Multiline Style. Vielen Dank.
Beiträge von HansJ54
-
-
Code
$idButtonJD1 = GUICtrlCreateButton("JD1", 8, 60, 60, 20, $BS_MULTILINE) $idButtonJD2 = GUICtrlCreateButton("JD2", 8, 90, 60, 20, $BS_MULTILINE) GUICtrlSetBkColor(-1, 0xFFFFE0)
Warum verändert GUICtrlSetBkColor() neben der Hintergrundfarbe auch den Rahmen und den Inhalt des Buttons? Eigentlich sollte aus dem grau nur gelb werden.
-
Ich habe schon automatische Sprünge aus der Kundenverwaltung implementiert, da landet man direkt im richtigen Ordner und kann maximal einen Unterordner des Kunden verschieben. Problem sind z.B. Mailanhänge, wo beim Abspeichern direkt die Kundenordner gesucht werden. Habe beim "schlimmsten" Kandidaten 40 Pixel eingestellt, dann passiert es nicht ganz so einfach. Was wäre "ACLs auf NTFS"?
-
Feinmotorikproblem oder Sekundenschlaf, eher letzteres ist mein Verdacht
Drag&Drop-Operation erst dann zu initiieren, wenn die Maus nach dem Markieren eine bestimmte Distanz zurückgelegt: hatte ich gefunden und teste das gerade, erste Idee war beim Hauptverursacher 100 Pixel einzustellen. Problem ist nur, das diese Einstellung zusätzlich auch auf das Verschieben von ganzen Fenstern wirkt und das sich dann erst bewegt, wenn man mit der Maus fast aus dem Bildschirm ist. Habe es jetzt auf ca. 3 cm eingestellt und seitdem erst mal keine neuen Treffer mit Verschiebungen.
-
Noch mal eine Korrektur: es gibt einen Ordner "kunden#" mit ausschließlich Kundennummern und darunter den Daten. Die brauche ich, um aus der alten DOS(!)-Kundenverwaltung die Kundenordner einfach über Kundennummer öffnen zu können. Um die Kunden auch über Namen direkt unter Windows zu suchen, gibt es einen zweiten Kundenordner "kunden" mit ausschließlich Junctions auf die Kundennummern im anderen Ordner, die den Namen des Kunden beinhalten. In dem Ordner passiert es immer mal wieder, dass jemand mit der Maus und linke Taste eine Junction versehentlich packt und verschiebt (und es dummerweise nicht merkt). Erste Idee war, dort verschobene Junctions zu suchen. Tatsächlich ergibt aber eine verschobene Junction unerwarteterweise keine Junction, sondern einen Ordner. Nachdem ich jetzt mit meinem Programm den "Nummern"-Ordner aufräumen konnte, ist der Ordner mit den Junctions auf den ersten Blick auch ok.
Ich habe bisher gesucht, ob z.B. ein Ordner Allgemein (der ist bei jedem Kunden auf der ersten Ebene) noch mal tiefer auftaucht. Letztlich fehlen mir jetzt vielleicht noch ein paar Ordner, die nicht über die Namen in der ersten Ebene auffindbar sind, sondern ..._1234 heißen. Theoretisch könnte es die geben, da meine Leute gelegentlich nicht nur die Junctions verschoben haben, sondern auch Unterordner. Praktisch weiß ich es nicht und von Hand zu suchen ist bei der Menge unmöglich.Also Aufgaben für meine nächste Nachtschicht:
gibt es im Nummernordner kunden# Ordner mit ..._1234 die in einer tieferen Ebene sind (kann sein, muss aber nicht)
gibt es im Junction-Ordner kunden "echte" Ordner, die unterhalb der Junctions sind - aber nicht da, wohin die Junction verweist sondern direkt in diesem Ordner. Kann es doch eigentlich nicht geben. -
Noch was für die Spezialisten: jetzt muss ich noch alle Verzeichnisse suchen, die nicht im Root sind, also irgendwo tiefer, in denen irgendwo _nnnn vorkommt, also ein Unterstrich und 4 Zahlen. Es würde mir aber auch schon reichen, alle _nnn überhaupt zu filtern. Kann man bei _FileListToArrayRec() irgendetwas mit RegEx machen?
-
Klappt alles perfekt, nochmals vielen Dank!
Bis auf ReDim, da habe ich mich wohl nicht exakt ausgedrückt - in meinem ersten Beispiel wird der alte Inhalt des eindimensionalen Arrays gelöscht. Aber ich habe _ArrayColInsert() gefunden, damit geht es natürlich (vorher vermutlich mal wieder nicht sinnvoll gesucht). -
Zuerst noch mal: vielen Dank für Eure Hilfe - zur Information über mich: ich habe im Studium noch mit Lochkarten gearbeitet ...
DOS-Dir: alles was ich über das "schwarze CMD-Fenster" abschicke ist für mich gefühlt noch DOS
Array: ich habe einfach ein großes Array definiert mit 120.000 und nachher mit ReDim angepasst. Das reduzierte die Zeit von 6 Stunden auf die 4 1/2 Minuten. Wenn ich vorher _DynArray-UDF gekannt hätte, wäre es sicher einfacher gewesen.
Array: wie kann ich bei einem Array[20][2] eine dritte Spalte zufügen, ohne den Inhalt zu verlieren? Bei ReDim war der Inhalt weg. Geht das ohne For $i ... und einem neuen Array?
BOM (Byte Order Mark - musste ich erst mal googeln): _FileListToArrayRec() passt für _ArrayDisplay() in AutoIt, aber anschließend schreibe ich mit _FileWriteFromArray($sFileNegPath, $aNegative, 1) in eine .csv um mit Excel weiterzuarbeiten. Da sind dann beim Öffnen die Umlaute falsch. Nach dem BOM habe ich mit dem Hexeditor geschaut: kein BOM vorhanden. Jetzt brauche ich noch Hilfe, wie ich ein Array speichern kann mit einem passenden BOM. Bei FileOpen() gibt es den Parameter, bei _FileWriteFromArray() scheinbar nicht. Array in String umwandeln und dann mit FileOpen/FileWrite schreiben oder gibt es eine bessere Lösung?
-
4 1/2 Minuten für über 100.000 Verzeichnisse mit _FileListToArrayRec() ohne DOS-Dir. EIn Problem war, dass ArrayAdd() ab über 10.000 Einträgen immer langsamer wurde und endlos dauerte. Daher alles sukzessive in vordefinierte Arrays gespeichert.
Jetzt bleibt nur noch das Restproblem, dass die gefundenen und in einer .csv gespeicherten kritischen Pfade (_FileWriteFromArray() nach _FileListToArrayRec() ) wieder Probleme mit den Umlauten haben. Wie kann ich die konvertieren?Kann ich dafür irgendwie $aCall = DllCall("user32.dll", 'BOOL', 'OemToCharA', 'PTR', DllStructGetPtr($tIn), 'PTR', DllStructGetPtr($tOut)) nutzen? Oder kann ich direkt eine passende Codepage irgendwie benutzen?
-
Code
Global $aOutput = _FileListToArrayRec($sSearchDir, "*", $FLTAR_FOLDERS, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH)
So klappt es - danke !
Allerdings eliminiere ich im ersten Schritt alle Verzeichnisse, die nicht verschoben sind und beim Rest - ca. 100-300 - hole ich mir den Owner. Wochenende gerettet
-
-
Danke, aber ich denke ich muss das noch anders lösen. Im Verzeichnis sind mehr als 100.000 Unterverzeichnisse und ich habe 12 Suchbegriffe (nicht nur die beiden). Das dauert wenn ich die alle 12 nacheinander durchgehe ...
Neue Idee: ich sammle sämtliche Ordner ohne Einschränkung in einem Array und laufe dann einmal über das Array und selektiere die gewünschten Ordner dabei.
Noch mal zur Info warum ich das mache:
ich suche immer noch in diesem Riesenverzeichnis die Unterverzeichnisse, die von irgendjemandem mit der Maus ungeschickt in ein anderes Verzeichnis verschoben wurden (habe aus einer Zeit von einem Jahr schon 5-fache Verschachtelungen untereinander gefunden. Wenn in einem Ordnerpfad 2 oder mehr von meinen Suchbegriffen sind, dann ist das einer der Treffer. Oder wenn ein Verzeichnis in der ersten Ebene keine Ordner und Daten hat.
Wenn ich dann noch ohne großen Aufwand zu diesen gefundenen Ordnern den jeweiligen "Besitzer" abfragen und in mein Array bekommen könnte, dann hätte ich auch eine Statistik, wer jeweils der Verursacher war. Hat jemand dazu eine Idee?
Danach muss ich in einem anderen Verzeichnis alle Unterordner finden, in denen eine Junction ist (eine Junction darf nur in der ersten Ebene sein, die besteht nur aus Junctions). Das ist aber nur ein untergeordnetes Problem, die stören nicht wirklich.
AspirinJunkie _prc_RunWithReturn() funktioniert einwandfrei, kann ich an anderer Stelle gut gebrauchen.
-
Code
Global $aArray = _FileListToArrayRec($sSearchDir, "Allgemein\;Daten\", $FLTAR_FOLDERS, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_RELPATH)
Bin auf diesen Befehl gestoßen, mit dem ich alle Verzeichnisse sammeln will, die unter einem Ordner "Allgemein" oder "Daten" noch Unterverzeichnisse haben. Mit dem \ in der Maske bekomme ich aber @extended = 2 wogegen der Befehl mit "Allgemein;Daten" ohne \ funktioniert, mir dann aber auch zusätzlich alle Verzeichnisse sammelt, die mit ...\Allgemein und ...\Daten enden. Fehler in der Function? Kann man das umgehen?
-
Code
Global $sSubOrdner = "Allgemein", $aSearchDeli= "_", $sFilePath = "J:\Kunden\Error.txt" $sSearch = @ComSpec & ' /c dir J:\Kunden\*' & $aSubOrdner[$i] & ' /s/b/ad |find "' & $aSearchDeli[$j] & '" >> ' & $sFilePath $iPID = Run($sSearch, "", @SW_HIDE) ProcessWaitClose($iPID)
So erzeuge ich die Datei.
-
Nach längerer Suche frage ich doch lieber:
Die Ausgabe von einem DOS-Dir-Befehl in eine Datei macht Probleme mit den Umlauten. Alles Mögliche versucht, um beim Öffnen der Datei mit Excel oder Notepad++ eine korrekte Darstellung zu erhalten sind gescheitert. Wie kann ich entweder die Ausgabe von Dir direkt mit richtigen Umlauten erzeugen oder alternativ wie kann ich eine Datei mit den "falschen" Umlauten "übersetzen"?
Ich habe eine Function von AspirinJunkie gefunden, die das vielleicht kann. Aber die bricht immer ab in der Zeile
$s_Ret = DllCall($h_User32DLL, 'BOOL', 'OemToChar', 'str', $s_Ret, 'str', '')[2] mit!>14:13:26 AutoIt3.exe ended.rc:-1073741819. Was mache ich falsch?
Code
Alles anzeigen$s_Cmd = "Dir" $sParameter = "J:\kunden" $b_CmdSpec = True $WorkDir = @WorkingDir $sResult = RunCmd($s_Cmd, $sParameter , $b_CmdSpec, $WorkDir) ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sResult = ' & $sResult & @CRLF) ; #FUNCTION# ====================================================================================== ; Name ..........: RunCmd() ; Description ...: runs commandline programs or cmd-command and return their output ; Syntax ........: RunCmd($s_Cmd, [$sParameter = '', [$b_CmdSpec = False, [$WorkDir = @WorkingDir]]]) ; Parameters ....: $s_Cmd - the command which should be executed (can be full command or without parameters) ; $sParameter - additional parameters for the command (also array of parameters) ; $b_CmdSpec - If true the command is interpreted as a command for cmd.exe ; $WorkDir - the working directory ; Return values .: Success: returns a string with the output ; Failure: set @error and returns a debug-string ; Author ........: AspirinJunkie ; ================================================================================================= Func RunCmd($s_Cmd, $sParameter = '', $b_CmdSpec = False, $WorkDir = @WorkingDir) Local Static $h_User32DLL = DllOpen('user32.dll') If @error Then Return SetError(1, @error, "") If $b_CmdSpec Then $s_Cmd = @ComSpec & " /c " & $s_Cmd Local $s_Ret, $s_Line, $s_Err If $sParameter <> '' Then If IsArray($sParameter) Then Local $s_Par = "" For $j In $sParameter $s_Par &= " " & $j Next $sParameter = $s_Par Else $sParameter = ' ' & $sParameter EndIf EndIf Local $iPID = Run($s_Cmd & $sParameter, $WorkDir, @SW_HIDE, 0x2 + 0x4) If @error Then Return SetError(2, @error, "") Do Sleep(10) $s_Line = StdoutRead($iPID) If @extended > 0 Then $s_Ret &= $s_Line Until @error Do Sleep(10) $s_Line = StderrRead($iPID) If @extended > 0 Then $s_Err &= $s_Line Until @error $s_Ret = DllCall($h_User32DLL, 'BOOL', 'OemToChar', 'str', $s_Ret, 'str', '')[2] If $s_Err <> "" Then If $s_Ret <> "" Then Return SetError(3, 0, "------- StdOut -----------" & @CRLF & $s_Ret & @CRLF & @CRLF & "------- StdErr -----------" & @CRLF & $s_Err) Return SetError(3, 0, $s_Err) EndIf Return $s_Ret EndFunc ;==>RunCmd
-
Es gibt Mitarbeiter die mit der Maus Ordner verschieben in andere Ordner (vermutlich wenn sie am Bildschirm einschlafen ). Bei den Windows-Bordmitteln habe ich Computer\HKEY_CURRENT_USER\Control Panel\Desktop\DragWidth und ...\DragHeight gefunden. Wenn man die Werte vergrößert, muss man sich schon mehr anstrengen mit dem ungewollten Verschieben. Leider beziehen sich die beiden Werte auch auf das Verschieben von Fenstern, was die Sache etwas lästig macht. Und außerdem gibt es in unserem Kundenordner mit ca. 20.000 Unterordnern immer noch Altlasten.
Idee daher, da es sich um Junctions handelt: wie kann ich einen Ordner durchsuchen nach Junctions, die unter irgendeiner Junction auftauchen? Über die Attribute geht es laut AutoIt-Hilfe nicht, aber z.B. beim Dir Befehl sieht es so aus:
-
Klappt perfekt, danke
-
Funktioniert, aber man muss sich durchhangeln:
Dem Sicherheitszertifikat dieser Website wird von Ihrem PC nicht vertraut.
Fehlercode: DLG_FLAGS_INVALID_CA
Mit FileZilla funktioniert es auch.
-
Mit InetRead() kann ich von allen Clients aus eine Webseite auslesen, vom Server aus klappt das nicht und ich bekomme Error 13. Wie kann ich feststellen, woran es liegt und was Error 13 dabei bedeutet? In der Hilfe habe ich nichts gefunden. Danke für Eure Hilfe!
-
Noch eine Bitte: wie erzeuge ich den JSON-String am geschicktesten? Aktuell setze ich ihn einfach als Textstring mit den Namen und Werten zusammen, aber da bietet AutoIt doch sicher eine bessere Lösung. Ich habe mich schon mit der JSON.au3 beschäftigt, aber finde nichts Passendes. Mir schwebt eine Idee vor von einem Array, in dem die Namen der Variablen als Index und zugeordnet die jeweiligen Werte stehen.
Ist kein wichtiges Problem, dient auch nur meiner "Weiterbildung"