Ich habe diesen Punkt mal in den Sammelthread :
Sammelthread "AutoIt Interne Funktionen : Erwartetes Ergebnis -> Tatsächliches Ergebnis"
aufgenommen.
Gruß Musashi
Ich habe diesen Punkt mal in den Sammelthread :
Sammelthread "AutoIt Interne Funktionen : Erwartetes Ergebnis -> Tatsächliches Ergebnis"
aufgenommen.
Gruß Musashi
Zu : IniRead* Funktionen und .ini-Dateien mit der Kodierung UTF-8 mit BOM
Ist eine .ini-Datei als UTF-8 mit BOM gespeichert, dann wird die erste Zeile der Datei von den IniRead* Funktionen nicht erkannt.
- falls Zeile 1 = Kommentarzeile, also ; Kommentar ... ==> unproblematisch
- falls Zeile 1 = [Sektion] ==> alle Key=Values der gesamten Sektion werden ignoriert
Der Grund für das Problem ist, dass bei UTF-8 Dateien am Anfang ein “Byte Order Mark” (kurz: BOM) steht. Der BOM für UTF-8 ist drei Bytes lang : EF BB BF -> nach Windows-1252 als “” dargestellt. In Editoren werden diese Zeichen häufig nicht angezeigt.
Hintergrund :
AutoIt verwendet für die Verarbeitung von .ini-Dateien API-Funktionen aus der Microsoft KERNEL32.DLL. IniRead ist 'nur' ein Wrapper für die Funktion 'GetPrivateProfileString'. GetPrivateProfileString(A) geht aber immer von einer ANSI (nicht verwechseln mit ASCII) Kodierung aus.
Hier mal die Ausgabe mittels Hex.Editor :
Hier als ANSI :
Beispielskript :
; Einlesen unterschiedlich kodierter INI-Dateien (ANSI/UTF8oBOM/UTF8mBOM)
; wg. möglicher Probleme bzgl. 'Byte Order Mark (BOM)'.
Global $g_sFile
; [Section1]
Global $g_sS1Key1Val, $g_sS1Key2Val
; [Section2]
Global $g_sS2Key1Val, $g_sS2Key2Val, $g_sS2Key3Val
; 1. Kodierung : ANSI
$g_sFile = @ScriptDir & "\ANSI.ini"
$g_sS1Key1Val = IniRead($g_sFile, "Section1", "Section1Key1", "")
$g_sS1Key2Val = IniRead($g_sFile, "Section1", "Section1Key2", "")
$g_sS2Key1Val = IniRead($g_sFile, "Section2", "Section2Key1", "")
$g_sS2Key2Val = IniRead($g_sFile, "Section2", "Section2Key2", "")
$g_sS2Key3Val = IniRead($g_sFile, "Section2", "Section2Key3", "")
_ConsoleOutput("+ >>>>> 1. Kodierung : ANSI <<<<< ")
; 2. Kodierung : UTF8 ohne BOM
$g_sFile = @ScriptDir & "\UTF8oBOM.ini"
$g_sS1Key1Val = IniRead($g_sFile, "Section1", "Section1Key1", "")
$g_sS1Key2Val = IniRead($g_sFile, "Section1", "Section1Key2", "")
$g_sS2Key1Val = IniRead($g_sFile, "Section2", "Section2Key1", "")
$g_sS2Key2Val = IniRead($g_sFile, "Section2", "Section2Key2", "")
$g_sS2Key3Val = IniRead($g_sFile, "Section2", "Section2Key3", "")
_ConsoleOutput("+ >>>>> 2. Kodierung : UTF8 ohne BOM <<<<< ")
; 3. Kodierung : UTF8 (mit BOM)
$g_sFile = @ScriptDir & "\UTF8mBOM.ini"
$g_sS1Key1Val = IniRead($g_sFile, "Section1", "Section1Key1", "")
$g_sS1Key2Val = IniRead($g_sFile, "Section1", "Section1Key2", "")
$g_sS2Key1Val = IniRead($g_sFile, "Section2", "Section2Key1", "")
$g_sS2Key2Val = IniRead($g_sFile, "Section2", "Section2Key2", "")
$g_sS2Key3Val = IniRead($g_sFile, "Section2", "Section2Key3", "")
_ConsoleOutput("+ >>>>> 3. Kodierung : UTF8 (mit BOM) <<<<< ")
; 4. Kodierung : UTF8 (mit BOM) - erste Zeile Kommentar
$g_sFile = @ScriptDir & "\UTF8mBOMc.ini"
$g_sS1Key1Val = IniRead($g_sFile, "Section1", "Section1Key1", "")
$g_sS1Key2Val = IniRead($g_sFile, "Section1", "Section1Key2", "")
$g_sS2Key1Val = IniRead($g_sFile, "Section2", "Section2Key1", "")
$g_sS2Key2Val = IniRead($g_sFile, "Section2", "Section2Key2", "")
$g_sS2Key3Val = IniRead($g_sFile, "Section2", "Section2Key3", "")
_ConsoleOutput("+ >>>>> 4. Kodierung : UTF8 (mit BOM) - erste Zeile Kommentar <<<<< ")
Func _ConsoleOutput($sInfoStr)
ConsoleWrite($sInfoStr & @CRLF)
ConsoleWrite("<[Sektion1]" & @CRLF)
ConsoleWrite("> Section1Key1 = " & $g_sS1Key1Val & @CRLF)
ConsoleWrite("> Section1Key2 = " & $g_sS1Key2Val & @CRLF)
ConsoleWrite("<[Sektion2]" & @CRLF)
ConsoleWrite("> Section2Key1 = " & $g_sS2Key1Val & @CRLF)
ConsoleWrite("> Section2Key2 = " & $g_sS2Key2Val & @CRLF)
ConsoleWrite("> Section2Key3 = " & $g_sS2Key3Val & @CRLF & @CRLF)
EndFunc
Alles anzeigen
>>>>> 1. Kodierung : ANSI <<<<<
>> [Sektion1]
Section1Key1 = Sec1/Value1
Section1Key2 = Sec1/Value2
>> [Sektion2]
Section2Key1 = Sec2/Value1
Section2Key2 = Sec2/Value2
Section2Key3 = ÄÖÜäöüß
>>>>> 2. Kodierung : UTF8 ohne BOM <<<<<
>> [Sektion1]
Section1Key1 = Sec1/Value1
Section1Key2 = Sec1/Value2
>> [Sektion2]
Section2Key1 = Sec2/Value1
Section2Key2 = Sec2/Value2
Section2Key3 = ÄÖÜäöüß
>>>>> 3. Kodierung : UTF8 (mit BOM) <<<<<
>> [Sektion1]
Section1Key1 =
Section1Key2 =
>> [Sektion2]
Section2Key1 = Sec2/Value1
Section2Key2 = Sec2/Value2
Section2Key3 = ÄÖÜäöüß
>>>>> 4. Kodierung : UTF8 (mit BOM) - erste Zeile Kommentar <<<<<
>> [Sektion1]
Section1Key1 = Sec1/Value1
Section1Key2 = Sec1/Value2
>> [Sektion2]
Section2Key1 = Sec2/Value1
Section2Key2 = Sec2/Value2
Section2Key3 = ÄÖÜäöüß
Natürlich kann man die Dateien umkonvertieren, die ersten Bytes prüfen und abschneiden usw.
Wer dieses Verhalten der Standard IniRead* Funktionen aber nicht kennt wird sich ggf. wundern, warum der Eintrag (also die Sektion, sowie darin befindliche Werte) nicht eingelesen wird .
Habe gerade nachgeschaut ja ist als UTF 8 gespeichert
Dann solltest Du sie mal als ANSI speichern.
Bei UTF-8 wird der Datei EF BB BF (Dezimal : 239 187 191) vorangestellt. Das führt dazu, dass IniRead die erste Zeile 'überliest'. Ist die erste Zeile ein Kommentar, ist das egal.
Bei Dir ist es aber die Sektion [Pfade] , die dann, wie bereits gesagt, komplett ignoriert wird.
Gruß Musashi
Prüfe mal, ob die INI-Datei in der Kodierung UTF-8 gespeichert ist.
Dann würde der erste Eintrag, bei Dir die Sektion [Pfade], komplett ignoriert !
EDIT :
;~ Local $config = "\\192.168.9.170\Export\office\buero\XXXXX\vordrucke\programme\Config\Meeting.ini"
Local $sIniFile = @ScriptDir & "\test-utf8.ini"
Local $tabelle = IniRead($sIniFile,"Arten","Tabelle","")
Local $abteilung = IniRead($sIniFile,"Arten","Abteilung","")
Local $aStandard = IniRead($sIniFile,"Arten","aStandard","")
Local $wStandard = IniRead($sIniFile,"Arten","wStandard","")
Local $ort = IniRead($sIniFile,"Arten","Wo","")
Local $spdf = IniRead($sIniFile,"Pfade","spdf","") & "\" & @YEAR & "\"
Local $sexcel = IniRead($sIniFile,"Pfade","sexcel","") & "\" & @YEAR & "\"
Local $mexcel = IniRead($sIniFile,"Pfade","mexcel","") & "\" & @YEAR & "\"
Local $mpdf = IniRead($sIniFile,"Pfade","mpdf","") & "\" & @YEAR & "\"
ConsoleWrite("Arten - tabelle = " & $tabelle & @CRLF)
ConsoleWrite("Pfade - $spdf = " & $spdf & @CRLF)
Alles anzeigen
Datei test-utf8.txt nach .ini umbenennen (.ini kann man im Forum nicht hochladen )
Gruß Musashi
Neue Version 901u (06. Januar 2020) verfügbar, siehe :
https://www.autoitscript.com/forum/applicat…nt.php?id=63419
* Sortiervariante "natural sort" wurde hinzugefügt
-->Danke an jchd für die Idee und Melba23 für die Funktion ArrayMultiColSort()
Obwohl "natural sort" nicht vollständig implementiert ist, sollte sie funktionieren wenn Zahlen vor Buchstaben stehen :
Testdatei : Sacramento real estate transactions
Das Ergebnis lässt sich hier z.B. anhand der Spalte 'street' nachvollziehen.
Sortierdauer und Aktualisierung der Listenansicht sind schnell, ggf. wegen der neuen Funktion _BufferCreate(), die hier beschrieben und jetzt zum Skript hinzugefügt wurde.
Kurz zum Hintergrund :
Im blauen Forum fragte ein User, ob man mit AutoIt einen unterbrochenen Download fortsetzen kann. Offenbar hat er eine langsame und recht störanfällige Internetverbindung.
Meines Wissens ist bei InetGet/InetRead, aber auch z.B. der WinHttp-UDF, im Falle eines Abbruches ein komplett neuer Download erforderlich. Ich habe auf die Schnelle jedenfalls kein AutoIt-Tool gefunden, wo ein 'partieller Download' bereits umgesetzt wurde.
Mein Vorschlag war daher, einen Downloadmanager zu verwenden, der :
- per API oder Kommandozeile gesteuert werden kann (in AutoIt einbinden)
- lizenzrechtlich möglichst frei ist
Nach kurzer Recherche bin ich über GNU Wget gestolpert.
https://en.wikipedia.org/wiki/Wget
https://www.gnu.org/software/wget/
Die aktuellen Windows-Binaries kann man hier herunterladen :
https://eternallybored.org/misc/wget/
Ich selbst benötige das Feature im Grunde nicht, da ich eine stabile 1 GBit/s Leitung habe .
Trotzdem ist mein Interesse nun geweckt . Wget kommt ja ursprünglich aus der Linux-Welt, soll aber auch unter Windows problemlos laufen.
Frage : Verwendet jemand Wget oder was wäre eure bevorzugte Lösung ?
Danke und Gruß Musashi
Ich öffne das Excelmakro in Autoit. Dann wird in Excel alles automatisch abgearbeitet.
Dieser Teil funktioniert ja offenbar, korrekt ?
Zum Schluß wird Excel per Makro beendet. Und dann kommt die Fehlermeldung.
Was passiert, wenn Du das AutoIt-Skript direkt nach Aufruf des Makros verlässt ?
Else
$oWorkbook.parent.run("Versand") ; Name des Makros
exit
EndIf
(soviel zum Thema : "damit gilt das Projekt als abgeschlossen" )
Neue Version 901t (03. Januar 2020) verfügbar, siehe :
https://www.autoitscript.com/forum/applicat…nt.php?id=63394
Das Kontextmenü wurde erweitert (öffnen mit Rechtsklick auf den jeweiligen Spaltentitel) :
In der Version 901s (Zwischenupdate) :
Die numerische Sortierung ist in den meisten Fällen in Ordnung, aber gelegentlich benötigt man auch eine String-Sortierung (wie im folgenden Bild gezeigt) :
In der Version 901t (momentan aktuell - enthält natürlich die 901s) :
(es wird empfohlen, vor dem Sortieren oder Löschen einen Export durchzuführen -> "Export now ?")
* "Rename Header" -> Umbenennen des Spaltentitels (Leereingaben oder identische Titel für mehrere Spalten werden abgefangen)
* "Insert Column (before)" -> fügt eine leere Spalte vor die akt. Spalte ein ==> siehe Besonderheit
* "Insert Column (after)" -> fügt eine leere Spalte hinter die akt. Spalte ein
* "Delete Column" -> löscht die akt. Spalte (mit Sicherheitsabfrage)
Besonderheit :
Microsoft hat es etwas schwierig gemacht, vor der Spalte 0 eine Spalte nativ einzufügen. Wer dies möchte, kann einfach eine Spalte hinter Spalte 0 einfügen und sie nach ganz links ziehen, um die beiden linken Spalten zu vertauschen.
jetzt kannst du mal was von dem alten Mann lernen.
Ich hatte nur kurz die Extension .xlsm auf Wikipedia gecheckt - da stand das so drin (s.o.).
Neues zu lernen stört mich nicht, egal ob von alten oder jungen Männern/Frauen/Klingonen usw. - sobald man damit aufhört ist eh Schicht im Schacht . Nebenbei : Uns trennen gerade mal 10 Jahre !
Dein Script läuft perfekt Excel wird geöffnet und auch wieder geschlossen.
Freut mich .
Wenn Du Dein Skript fertig hast, kannst Du es ja noch mal posten.
So muss z.B. Dim $objXL nicht innerhalb der While-Schleife deklariert werden. Außerdem würde ich eine Deklaration mittels Global / Local vorziehen.
Gruß Musashi
Danke, Danke! Läuft fehlerfrei auch compiliert. Wo muss ich jetzt meine Makro Datei einsetzen (Versand.xlsm) brauche ich den Run Befehl nicht mehr.
Das mit dem Dateityp .xlsm ist mir noch unklar (wie gesagt, ich arbeite ohne Excel - also blind ).
.Workbooks.Open ("C:\DHL-Versand\Versand.xlsm")
-> Unter Dateiformate steht :
Microsoft Excel ab 2007 und 2008 erstellen standardmäßig Dateien mit den Dateiendungen .xlsx (Excel Spreadsheet) oder .xlsm (Excel Spreadsheet mit Makros).
Die von älteren Versionen erstellten Dateien haben die Dateiendung .xls (Excel Spreadsheet), .xla (Excel Add-ins) und .xlt (Excel-Vorlagen).
(Excel 97 hat intern die Versionsnummer 8.0 - siehe : Microsoft_Excel )
Ohne Gewähr :
(den COM Errorhandler habe ich auskommentiert -> kannst Du ja mal aktivieren)
#include <Excel.au3>
#include <MsgBoxConstants.au3>
; ===> COM Errorhandler : Kommentarzeichen bei Bedarf entfernen
;~ Local $oErrorHandler = ObjEvent("AutoIt.Error", "_COMErrFunc")
; Erstellt ein Excel Anwendungs-Objekt oder verbindet zu einer bereits Instanz
Local $oExcel = _Excel_Open()
If @error Then
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Open ", _
"Fehler beim Erstellen des Excel Anwendungs-Objekt." & @CRLF & _
"@error = " & @error & ", @extended = " & @extended)
Else
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Open ", _
"Excel Anwendung wurde erfolgreich geöffnet." & @CRLF)
; öffnet ein existierendes workbook und gibt den Objectidentifier zurück :
Local $sWorkbook = "C:\DHL-Versand\Versand.xlsm"
Local $oWorkbook = _Excel_BookOpen($oExcel, $sWorkbook)
If @error Then
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookOpen ", _
"Fehler beim Öffnen des Workbooks : " & @CRLF & _
"Dateiname : " & $sWorkbook & @CRLF & _
"@error = " & @error & ", @extended = " & @extended)
_Excel_Close($oExcel)
Exit
Else
$oWorkbook.parent.run("Versand") ; Name des Makros
EndIf
Sleep(2000)
; Schließt das Excel Anwendungs-Objekt
_Excel_Close($oExcel)
If @error Then
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Close ", _
"Fehler beim Schließen des Excel Anwendungs-Objekt." & @CRLF & _
"@error = " & @error & ", @extended = " & @extended)
Else
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Open ", _
"Excel Anwendung wurde erfolgreich geschlossen." & @CRLF)
EndIf
EndIf
; ===> COM Errorhandler : Kommentarzeichen bei Bedarf entfernen
;~ Func _COMErrFunc($oError)
;~ MsgBox(16, "COM Error", "COM-Error ! " & @CRLF & _
;~ "Number is : " & "0x" & Hex($oError.number) & @CRLF & _
;~ "Retcode is : " & "0x" & Hex($oError.retcode) & @CRLF & _
;~ "Scriptline is : " & $oError.scriptline & @CRLF & _
;~ "Windescription is: " & $oError.windescription & @CRLF & _
;~ "Description is: " & $oError.description)
;~ Return SetError(1)
;~ EndFunc ;==>_COMErrFunc
Alles anzeigen
Gruß Musashi
Excel UDF : Ich bräuchte schon ein Beispiel :
[...]
Die Fehlermeldung kommt wenn Excel geschlossen ist, also kann es nicht an Excel liegen.
Kann man die Fehlermeldung irgendwie abfangen und mit exit beenden.
Leider habe ich kein Excel auf meinem PC, daher ist das hier ein Schuss in's Blaue .
Du solltest mit einem Minimalskript testen, welches sich ausschließlich mit dem Abfangen der Fehlermeldung beschäftigt ! Automatisierungen kannst Du später (wieder) hinzufügen, wenn es läuft.
Was kommt dabei heraus ? :
#include <Excel.au3>
#include <MsgBoxConstants.au3>
; Erstellt ein Excel Anwendungs-Objekt oder verbindet zu einer bereits Instanz
Local $oExcel = _Excel_Open()
If @error Then
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Open ", _
"Fehler beim Erstellen des Excel Anwendungs-Objekt." & @CRLF & _
"@error = " & @error & ", @extended = " & @extended)
Else
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Open ", _
"Excel Anwendung wurde erfolgreich geöffnet." & @CRLF)
Sleep(2000)
; Schließt das Excel Anwendungs-Objekt
_Excel_Close($oExcel)
If @error Then
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Close ", _
"Fehler beim Schließen des Excel Anwendungs-Objekt." & @CRLF & _
"@error = " & @error & ", @extended = " & @extended)
Else
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Open ", _
"Excel Anwendung wurde erfolgreich geschlossen." & @CRLF)
EndIf
EndIf
Alles anzeigen
Gruß Musashi
Kann man die Fehlermeldung irgendwie abfangen und mit exit beenden.
Du könntest einen COM Error Handler einbauen (einfach mal googlen).
Ich würde aber dringend den Rat von water beherzigen, und die <excel.au3> verwenden.
Siehe Hilfe oder https://www.autoitscript.com/wiki/Excel_UDF
Gruß Musashi
Neue Version 901r (29. Dezember 2019) verfügbar, siehe :
https://www.autoitscript.com/forum/applicat…nt.php?id=63337
Sollten keine Fehler auftauchen, gilt das Projekt damit als abgeschlossen.
Neu :
* Sortierung auf allen Spalten möglich (mit rechter Maustaste auf die Spaltenüberschrift klicken) :
Es wird empfohlen, vor der Sortierung einen Export (als Backup) durchzuführen.
Bei mir ist da kein halbes weißes Fenster beim runter scrollen mit Bild-Runter!?
Bei mir auch nicht (Win 7) ! Bernhard65 : Hast Du ggf. Aero aktiviert ?
Zu 2. : Bei Oscar's Lösung ist auch das Flackern beim Kopieren in die Zwischenablage weg !
Gruß Musashi
Willkommen im Forum !
Vorab : Es gibt so etwas wie Satzzeichen (Punkt, Komma), die das Lesen deines Bandwurmsatzes deutlich erleichtern würden .
Fertige Game Recorder, mit denen man Spielsequenzen aufnehmen kann, gibt es reichlich(falls es das ist was Du suchst). Aus Deiner Frage werde ich nämlich nicht ganz schlau.
Sollte es Dir allerdings um Spieleautomatisierung gehen, dann empfehle ich einen Blick in die Forenregeln .
EDIT Raupi : Könntest Du das Thema bitte von 'Skripte' nach 'H&U' verschieben ?
Neue Version 901p (25. Dezember 2019) verfügbar, siehe :
https://www.autoitscript.com/forum/applicat…nt.php?id=63305
Neu :
* Die Reihenfolge der Spalten (columns) kann jetzt umsortiert werden.
Dazu mit dem Mauszeiger auf die gewünschte Spaltenüberschrift gehen und die linke Maustaste betätigen (nicht loslassen). Jetzt die Spalte nach rechts oder links an die gewünschte Position verschieben (Maustaste loslassen). Die Spalte (hier z.B. 'zip') weit genug an die neue Stelle ziehen :
Die exportierte CSV-Datei wird entsprechend der neuen Spaltenreihenfolge gespeichert.
* Die Liste der Delimiter (Feldtrennzeichen) wurde um | (Pipe bzw. 'senkrechter Strich') erweitert.
WebDriver ist der aktuelle Weg um FF zu automatisieren. Ob man damit auch den FF in ein GUI einfügen kann, weiß ich leider nicht.
Ich auch nicht, aber folgendes Statement habe ich dazu gefunden :
Also I'd like to 'embed' the FireFox browser in the same way I have previously with IE...
Hier die Antwort von Danp2 (dem Ersteller der WebDriver UDF) :
https://www.autoitscript.com/forum/topic/19…comment=1394248
I don't believe the Webdriver specs deal with embedded browsers, so you would need to handle that on your own.
Danp2 ist sehr aktiv und der Thread zur WebDriver UDF ist hochaktuell.
Allerdings geht das Thema mittlerweile über 58 Seiten und ist alles andere als trivial, also nichts, was man mal am Rande so mitnimmt.
Gruß Musashi
Ich meine wir hatten das schon mal irgendwann. War das etwas mit dem Windows Style, dass die Ränder nicht angezeigt werden?
Du meinst wahrscheinlich das hier :
AutoIt Info Tool zeigt andere Größe an, als WinGetPos()
Gruß Musashi
Ist das normal?
Nur auf die Schnelle, bin gerade am Wein trinken .
Ob das normal ist - wer weiß. Zumindest bist Du nicht der Einzige :
windows10-window-position-is-wrong-in-autoit-window-info
Edit : Tweaky
Neue Version 901m (18. Dezember 2019) verfügbar, siehe :
https://www.autoitscript.com/forum/applicat…nt.php?id=63266
Es gibt jetzt 2 Möglichkeiten, die CSV-Datei zu importieren:
* Import-Button
* indem man sie direkt per Drag-and-Drop in die GUI zieht (Bereich der Listview).