1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Neophytus

Beiträge von Neophytus

  • alle FONTS im Ordner und Unterordner installieren

    • Neophytus
    • 4. März 2016 um 13:56

    Mal eine Frage zum Ausgangsscript oben:
    $sFontDescript wird von $sFontName hergeleitet, was nur eine Verlegenheitslösung ist.

    Besser wäre es, die korrekte Eigenschaft (im Windows Explorer Titel, in otfinfo.exe Full Name) auszulesen.
    Z.B. von SourceCodePro-sb.otf lautet der Full Name Source Code Pro Semibold.
    In der Registry muss demnach etwas wie Source Code Pro Semibold (TrueType) - eigentlich ..(OpenType) - stehen.

    Weiß jemand, wie das am einfachsten mit AutoIt funktioniert?

  • Elemente in HTML-Dokument finden und auslesen (DOM?)

    • Neophytus
    • 5. Juli 2013 um 19:42

    Komme leider auf keinen grünen Zweig, Testausgaben: nur Nullstrings. :(

    So etwas in der Art:

    [autoit]

    #include <_HTML.au3>
    (...)
    ;sample.html liegt im gleichen Verzeichnis
    Global $HTML = FileRead("sample.html")
    $elem = _HTML_Get($HTML, "div", "id", "tellowsscore")
    MsgBox(4096, "Result", $elem, 30)

    [/autoit]


    gibt mir die Div-Id zurück (tellowscore).

    Und wie komme ich nun an den Inhalt ran? (_HTML_GetText, schon klar. Wie genau?)
    Kommt _HTML_UDF eigentlich mit UTF8 (ohne BOM) klar? Weiß das jemand?

  • Elemente in HTML-Dokument finden und auslesen (DOM?)

    • Neophytus
    • 3. Juli 2013 um 01:04

    Danke für die Vorschläge. Ich finde _HTML_UDF ein Superprojekt, und es wäre toll, wenn ich damit wenigstens die Suche auf div#details eingrenzen könnte, nur krieg ich schon das nicht hin...

    $select = _HTML_Get($HTML, "div", "id", "details")
    (Entweder ist dieser Aufruf falsch oder die Funktion kann das nicht...)

    Und Friesel: Ja, eventuell komme ich, wenn ich mich auf den relevaten Teil (#details) der Seite beschränke, mit StringRegExp weiter. Allerdings will ich mich nicht darauf verlassen (ich bin recht fit in Regex, daran liegt es nicht).

  • Elemente in HTML-Dokument finden und auslesen (DOM?)

    • Neophytus
    • 2. Juli 2013 um 23:01

    Hallo AutoIt-Profis,

    ich möchte vereinfacht gesagt eine HTML-Seite laden, anhand des DOM Elemente suchen, deren Inhalt auslesen und in Variablen übernehmen.

    Ich brauche dafür weder GUI noch Fortschrittsmeldungen und dachte an eine Rückgabe als Ini oder etwas in der Art.

    Ich habe in meinem persönlichen "Hello-World-Versuch" für AutoIt mit
    Local $hp = BinaryToString(InetRead('http://example.org'), 4)
    experimentiert und schlussendlich mit StringRegExp aus $hp die Infos extrahiert.
    (Hat soweit funktioniert, ist aber für dieses Mal nicht mehr flexibel genug.)

    In CSS-Selektorensyntax (via DOM) hätte ich ungefähr das:
    #details > div.box:nth-child(2) > p:nth-child(2) > span:nth-child(2)
    Ich steige also beim (DIV-)Element mit der Id details ein und hangle mich von da an runter, andere Notation:
    #details > div[class="box box1"] > p[style="float:left;width:235px;"] > strong:first-child+span

    Welche Möglichkeiten habe ich, per DOM-Methoden (getElementbyId, getElementbyClassName etc.) Webinhalte zu filtern? Muss ich dazu IE.au3 verwenden, also eine (nicht zwingend sichtbare) IE-Instanz?
    Oder gibt es Alternativen?

    Danke für eure Tipps!

  • Zeilenweises Löschen in Textdatei: A bis B

    • Neophytus
    • 12. Juni 2013 um 19:20

    Nachtrag: Soweit klappt inzwischen alles.

    Wen es noch interessiert, es sieht jetzt so aus:

    Spoiler anzeigen
    [autoit]


    ; Converts Opera specific urlfilter.ini files for SRware Iron (more primitive adblock.ini syntax)
    #NoTrayIcon
    #include <Array.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $AdbMain, $AdbRus, $NewAdbMain, $NewAdbRus, $iniFetch, $outputFile

    [/autoit] [autoit][/autoit] [autoit]

    If FileExists(@ScriptDir & "\adblock.ini") Then FileDelete(@ScriptDir & "\adblock.ini")
    $iniFetch = InetGet("http://www.fanboy.co.nz/adblock/opera/complete/urlfilter.ini", @ScriptDir & "\adb_main.ini", 4)
    If @error Then Exit
    $iniFetch = InetGet("http://www.fanboy.co.nz/adblock/opera/rus/urlfilter.ini", @ScriptDir & "\adb_rus.ini", 4)
    InetClose($iniFetch)

    [/autoit] [autoit][/autoit] [autoit]

    If _FileReadToArray(@ScriptDir & "\adb_main.ini", $AdbMain) = 0 Then MsgBox(4096, "Error", "Reading adb_main.ini failed", 10)
    If _FileReadToArray(@ScriptDir & "\adb_rus.ini", $AdbRus) = 0 Then MsgBox(4096, "Error", "Reading adb_rus.ini failed", 10)

    [/autoit] [autoit][/autoit] [autoit]

    $NewAdbMain = ReduceFile($AdbMain)
    $NewAdbMain = ConvRules($NewAdbMain)

    [/autoit] [autoit][/autoit] [autoit]

    $NewAdbRus = ReduceFile($AdbRus)
    $NewAdbRus = ConvRules($NewAdbRus)

    [/autoit] [autoit][/autoit] [autoit]

    $outputFile = FileOpen(@ScriptDir & "\adblock.ini", 10)
    FileWrite($outputFile, StringReplace($NewAdbMain & $NewAdbRus, @Crlf, '', -1))
    FileClose($outputFile)

    [/autoit] [autoit][/autoit] [autoit]

    ; Description : Strips down given array
    ; Syntax : ReduceFile(ByRef $FileArray)
    ; Return values : Array
    Func ReduceFile($which)
    Local $A, $B
    Local $i=0, $j=0
    Local $returnArr[UBound($which)]
    $A = 1 ; Skip 0th element
    $B = $which[0]
    For $elem In $which
    If StringRegExp($elem, '.*Fanboy.s\s.+\-addon') Then $A = $i
    If StringRegExp($elem, '.*Opera\sSpecific') Then $B = $i
    $i+=1
    Next
    For $i=$A To $B
    $returnArr[$j] = $which[$i]
    $j+=1
    Next
    ReDim $returnArr[$j]
    Return $returnArr
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; Description : Parses and converts given array
    ; Syntax : ConvRules(ByRef $FileArray)
    ; Return values : String
    Func ConvRules($which)
    Local $returnStr = ''
    For $i=0 To UBound($which)-1
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;\s?(Fanboy.+)\s(\(.+\))', "# \1 (converted for Iron)")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;\s?(?=Updated)', "# ")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;.*', "")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^prioritize.*', "")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^\*?:\/\/.+', "")
    $which[$i] = StringRegExpReplace($which[$i], '\*', "")
    $which[$i] = StringRegExpReplace($which[$i], '\[.+\]\s?', "")
    $which[$i] = StringRegExpReplace($which[$i], '\&amp;?', "&")
    If StringRegExp($which[$i], '(?m)^$', 0) Then
    ContinueLoop
    EndIf
    $returnStr &= $which[$i] & @Crlf
    Next
    Return $returnStr
    EndFunc

    [/autoit]
  • Zeilenweises Löschen in Textdatei: A bis B

    • Neophytus
    • 1. Juni 2013 um 15:00

    Danke, misterspeed, klappt bestens!

    Zwei Funktionen gibt es, weil

    • die Prüfung der Blöcke, die entfernt werden sollen, evtl. ausgebaut wird (hängt von Fanboy ab),
      damit bleibt es übersichtlicher
    • ich Kommentarzeilen von ; nach # überführe und nicht komplett entferne (z.B. Updated-Zeile)
  • Zeilenweises Löschen in Textdatei: A bis B

    • Neophytus
    • 31. Mai 2013 um 17:29

    Danke für die Anmerkungen.

    Ich habe das Skript überarbeitet, im groben und ganzen funzt es, ein paar Kleinigkeiten stören aber noch:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $FileArr, $NewFileArr
    ; Datei lokal abgelegt, soll in Endfassung noch flexibilisiert werden...
    If _FileReadToArray(@ScriptDir & "\rus_urlfilter.ini", $FileArr) = 0 Then MsgBox(4096, "Error", "Error")
    $NewFileArr = StripArray($FileArr)
    $NewFileArr = ParseArray($NewFileArr)
    _FileWriteFromArray(@ScriptDir & "\output.ini", $NewFileArr)

    [/autoit] [autoit][/autoit] [autoit]

    #cs --------------------------------------------------------------------------------
    Probleme: Neu geschriebene output.ini weist unnötigen Umbruch (@Crlf) am Ende auf
    --> löschen da sonst beim Verketten wieder Leerzeilen '(?m)\n$' entstehen.
    #ce --------------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func StripArray($which)
    Local $A, $B
    Local $i=0
    $B = $which[0] ; Anzahl Arrayelemente
    $A = $B ; falls Suchmuster fehlt
    For $line In $which
    If StringRegExp($line, '.*Opera\sSpecific') Then
    $A = $i
    ExitLoop
    EndIf
    $i+=1
    Next
    If $B > $A Then ; nur falls Suchmuster gefunden
    For $rm=$B To $A Step -1
    _ArrayDelete($which, $rm)
    Next
    EndIf
    _ArrayDelete($which, 0) ; veraltete Größenangabe löschen (geht das auch einfacher?)
    Return $which
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func ParseArray($which)
    Local $retArr[UBound($which)]
    Local $j=0
    For $i=0 To UBound($which)-1
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;\s?(Fanboy.+)\s(\(.+\))', "# \1 (Iron)")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;\s?(?=Updated)', "# ")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^;.*', "")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^prioritize.*', "")
    $which[$i] = StringRegExpReplace($which[$i], '(?m)^\*?:\/\/.+', "")
    $which[$i] = StringRegExpReplace($which[$i], '\*', "")
    $which[$i] = StringRegExpReplace($which[$i], '\[.+\]\s?', "")
    $which[$i] = StringRegExpReplace($which[$i], '\&amp;?', "&")
    If StringRegExp($which[$i], '(?m)^$', 0) Then
    ContinueLoop
    EndIf
    $retArr[$j]=$which[$i]
    $j+=1
    Next
    ReDim $retArr[$j]
    Return $retArr
    EndFunc

    [/autoit]


    Ein Punkt: _FileWriteFromArray() scheint den Array mit abschließendem/redundantem Zeilenumbruch als Datei zu schreiben.
    Das möchte ich nicht! Gibt es eine Möglichkeit, das zu verhindern?
    Bei meinem allerersten FileRead-Entwurf ließ sich das mit StringRegExpReplace beheben...

  • Zeilenweises Löschen in Textdatei: A bis B

    • Neophytus
    • 30. Mai 2013 um 14:49

    Mein Q'n'd-Entwurf für Teil 1:

    Spoiler anzeigen
    Code
    Global $FileArr
    Global $NoA, $NoB ; für die Zeilen A, B
    If _FileReadToArray(@ScriptDir & "\rus_urlfilter.ini", $FileArr) = 0 Then MsgBox(4096, "Error", "Error")
    Global $myOut = @ScriptDir & "\rus_urlfilter_new.ini", $outIni = FileOpen($myOut,2)
    
    
    $NoB = $FileArr[0] ; ..[0] Anzahl d. Arrayelemente
    
    
    $i=0
    For $line In $FileArr
       If StringRegExp($line, '.*Opera\sSpecific') Then $NoA = $i
       $i+=1
    Next
    ; Check auf korrekt zugewiesener $NoA spar ich mir hier mal...
    For $rm=$NoB To $NoA Step -1
       _ArrayDelete($FileArr, $rm)
    Next
    Alles anzeigen

    Der tut was er soll (nämlich A bis B löschen).

    Was nicht funktioniert, ist Teil 2:

    Code
    For $line In $FileArr
       $line = StringRegExpReplace($line, '^;.*\n', "")
       $line = StringRegExpReplace($line, '^prioritize.*\n', "")
       $line = StringRegExpReplace($line, '^\*?:\/\/.+\n', "")
       $line = StringRegExpReplace($line, '\*', "")
       $line = StringRegExpReplace($line, '\[.+\]\s?\n', "")
       $line = StringRegExpReplace($line, '\&amp;?', "&")
       $line = StringRegExpReplace($line, '\n$', "")
    Next
    _FileWriteFromArray(@ScriptDir & "\rus_urlfilter_new.ini", $FileArr)


    Offenbar kann StringRegExpReplace so nicht auf meinen Array anwenden...
    :huh:

  • Zeilenweises Löschen in Textdatei: A bis B

    • Neophytus
    • 29. Mai 2013 um 13:49

    Das ^ist es leider noch nicht. Zwar bekomme ich über den _FileReadtoArray-Ansatz den Block gelöscht, allerdings klappen meine Regex-Ersetzungen so nicht mehr. Zum Beispiel muss ich global alle "*" durch Nullstrings ersetzen oder reguläre Vorkommen "&amp;?" durch "&" usw.
    Mit FileRead() bekam ich die Dateiinhalts-Variable auf die ich problemlos alle StringRegExpReplace anwenden konnte.

  • Zeilenweises Löschen in Textdatei: A bis B

    • Neophytus
    • 26. Mai 2013 um 18:24

    Danke, ich teste das nachher mal mit den Varianten (cz/jpn/pol/rus) durch.

    Zu den StringRegExpReplaces: Ich war nicht sicher, wie sich das (geschwindigkeitsmäßig) auswirkt:
    n Ausdrücke pro Schleifenelement versus n Ausdrücke auf FileRead-Variable...

    Vorteil der $aFileArray-Sache ist natürlich, dass ich 2 Arrays verbinden und Duplikate entfernen kann.
    Mal schauen wie das in AutoIt klappt... ;)

    Gruß,
    ein Neuer

  • Zeilenweises Löschen in Textdatei: A bis B

    • Neophytus
    • 26. Mai 2013 um 17:12
    Zitat von misterspeed

    Anhand der Beispieldatei und deiner Beschreibung willst du lediglich die paar Kommentarzeilen am anfang der ini Datei entfernen. [...]

    Ergebnis ist dann eine bereinigte Kopie des ursprünglichen Arrays.

    Korrekt, dieser Fall wäre allerdings trivial und wie du richtig bemerkst, ziemlich einfach zu lösen.

    Konkret, wenn du die verlinkte urlfilter.ini hast, diese enthält (wie andere Varianten auch) 1 Abschnitt "^.*\(Opera\sSpecific)", den ich für die Regex-Behandlung nicht gebrauchen kann (d.h. alles ab/inkl. der ; Zeile bis zum Ende des Blocks), also muss ich ihn zuvor löschen:

    Ich erhalte also für $A 13106 als Wert, $B entspricht 13169. Bleibt nur noch das Löschen dieser 63 Elemente über _ArrayDelete...
    (Jener Fall setzt voraus, dass nach A kein weiterer mit ; eingeleitete Block folgt, der nicht gelöscht werden darf.)

    Im 2. Teil folgen die StringRegExpReplaces. Keine Ahnung ob das so mit dem $aFileArray klappt; möglich dass ich den Inhalt erst mit _FileWriteFromArray als Datei zurückschreibe und anschließend noch mal mit FileRead einlesen muss... eben schön umständlich. :D

    Tja... 

  • Zeilenweises Löschen in Textdatei: A bis B

    • Neophytus
    • 26. Mai 2013 um 16:05

    YaeroxXO, ich habe so eine Ini testweise mal per _FileReadToArray eingelesen.
    Reguläre Ersetzungen (insg. 6-10) habe ich erst mal hintangestellt (Teil 2).

    Teil 1:
    Ich nudle Fanboys Datei-Array per RegExp-Match durch (Iterationsvariable läuft mit) und bekomme $A.

    Per $aFileArray[0] kenne ich das letzte Element = die letzte Zeile und somit $B.
    (Da's erst mal ein Quick-n-dirty-Ansatz ist, prüfe ich an dieser Stelle nicht auf Mehrfachvorkommen usw.)

    Ich könnte also $aFileArray von B nach A durchnudeln und _ArrayDelete($aFileArray, $i) darauf ansetzen.
    Geht's eventuell klüger/kürzer, vielleicht eine inoffizielle Array-Funktion _ArrayDeleteRange($aFileArray, $A, $B)?

    Die Dateien liegen übrigens größenmäßig bei 12T - 20T Zeilen.
    Wenn ich 2 Datei-Arrays kombiniere bekomme ich also bis zu 40T Elemente.

  • Zeilenweises Löschen in Textdatei: A bis B

    • Neophytus
    • 23. Mai 2013 um 18:59

    Sollte vielleicht noch ergänzen, dass Entfernen von A bis B nur ein Teil der Behandlung ist.
    Im ersten Teil des Skripts lese ich per FileRead die Datei komplett ein um eine Reihe von StringRegExpReplace-Befehlen drauf loszulassen, wobei ich das evtl. auch später tun könnte...

    Es geht um Input jener Art. Dadrin suche ich (regulär) den letzten ;-Abschnitt zum Entfernen, evtl. ist es nicht mit einem Löschvorgang getan. Weiß grade nicht, ob Geschwindigkeit Priorität hat (schätze eher nicht), aber ich habe so ByRef-Funktionsgedöns vor Augen... muss mich noch mehr an AutoIt-Syntax gewöhnen...

    Ich stricke den Kram so lange um bis ich das Endergebnis als adblock.ini mit dem SRware Iron verwenden kann, so jedenfalls mein Plan... :whistling:

  • Zeilenweises Löschen in Textdatei: A bis B

    • Neophytus
    • 23. Mai 2013 um 16:17

    Hallo,

    ich möchte Folgendes automatisieren:

    • Textdatei öffnen
    • Startzeile finden (z.B. per RegExp), Zeilennummer ermitteln (A)
    • optional: Endzeile finden (s.o.), Zeilennummer ermitteln; alternativ: letzte Zeile/letzter Umbruch verwenden (B)
    • von einschließlich A bis inklusive B löschen
    • Änderungen speichern (trivial)

    Manuell würde ich mit Hilfe von GVim folgendermaßen vorgehen:

    • /.*Suchmuster → eindeutiger Treffer in Zeile A (B sei letzte Zeile in Datei)
    • :A,Bd → Lösche (delete) die Zeilennummern A bis (einschließlich) B
    • :x → schreibe Puffer/übernehme Änderungen

    Wie könnte ein halbwegs... eleganter Ansatz für AutoIt aussehen; so grundsätzlich...?
    Mir geht's hauptsächlich um A und ggf. B (bzw. letzte Zeile ^[\w\s]+$).

    Danke für eure Ideen!

    Ein Neuling

  • Heredoc in AutoIt bzw. Alternativen

    • Neophytus
    • 11. Mai 2013 um 19:18

    Hallo AutoIt-Experten,

    ich gebe hier mal meinen Einstand: bin kein totaler Programmieranfänger, nur Erfahrung in AutoIt hab ich noch keine.
    Ich suche ein Konzept wie Heredoc, welches ich von PHP kenne, für AutoIt.

    Ich würde gern ein DOS-Skript damit im .au3 kapseln, als Datei schreiben, ausführen (RunWait) und dessen Log anschließend mit AutoIt weiterverarbeiten:

    Code
    ;Cmd-Datei aus $fileContent
    $fileContent = <<<MyCmd
    @echo off &setlocal EnableDelayedExpansion
    <nul (Set/p =) >%~n0.log
    For /f "usebackq delims=" %%f In (`Dir/b/on *.ext`) Do (
       Rem Code & Echo >>%~n0.log ...
    )
    endlocal
    Exit/b 0
    MyCmd;


    Vorteil: Kein & _, & @Crlf und somit besser lesbarer Code.

    Gibt es in AutoIt etwas in der Art?

    P.S.:
    Ja, ich habe auch versucht, das Cmd-Skript in AutoIt nachzubilden. Ist mir nur teilweise gelungen, so etwas

    Code
    For /f "usebackq" %%? In (`7z e -so %%f manifest.json^|jq -r ^.version`) Do (@Set Version=%%?)


    (= 7z-Extraktion einer einzelnen Datei des Containers nach Stdout als Eingabe an jq und dessen Ausgabe in $Version)
    kriege ich mit AutoIt nicht gelöst. :(

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™