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. BugFix

Beiträge von BugFix

  • Den Namen der aktiven (oder aufrufenden) Function ermitteln

    • BugFix
    • 23. November 2018 um 17:41
    Zitat von Code-Jack

    Es wäre bequemer und zudem für die Suche im Quelltext vorteilhafter, wenn ich dort jedes Mal eine stets identische Codezeile reinpacken könnte, die den Namen selbst ermittelt.

    Einfach eine Funktion schreiben, die bei Aufruf per Hotkey die Funktion in der vorangehenden Zeile abfragt und deine Debugzeile mit Funktionsnamen einfügt. Geht am Einfachsten mit Lua, aber auch mit AutoIt über das SciTE-Interface.

  • Reguläre Ausdrücke Sammlung

    • BugFix
    • 21. November 2018 um 21:35

    Ich habe eine interessante Fähigkeit der PCRE-Engine in einem Tut entdeckt: SKIP & FAIL.

    Was bedeutet das? Das ist eine Anweisung bei einem Match, diesen zu überspringen (SKIP), zu ignorieren (FAIL) und ab dieser Position weiter zu suchen. Das erleichtert einige Pattern, da man einiges an Capturing vermeiden kann.

    Ich habe mal ein Bsp. erstellt.

    Bsp. Blacklist
    Code
    #cs
        BLACKLIST
    
        - Aus einer Auflistung von Namen sollen nur die gewählt werden, die nicht in der Blacklist stehen.
        - Die Quelldaten sind als fortlaufender String: "Name1 Name2 Name3 usw." bereitzustellen.
    #ce
    
    
    ; Die Blacklist liegt als einfaches Array vor
    Global $aBlackList[3] = ['Peter', 'Paul', 'Maria']
    
    ; Die Quelldaten
    Global $sTest = 'Anna Fred Günther Lothar Maria Magdalena Paul Paula Peter Renate Siggi'
    
    ; Erstellen des Pattern
    Global $sPatt = _BlacklistPatternCreate($aBlackList, '[a-zA-ZäöüÄÖÜß]+')
    
    ; Abfrage Ergebnis
    Global $aMatch = StringRegExp($sTest, $sPatt, 3)
    If IsArray($aMatch) Then
        For $i = 0 To UBound($aMatch) -1 Step 1
            ConsoleWrite($aMatch[$i] & @CRLF)
        Next
    EndIf
    
    ; Funktion zum Erstellen des Pattern
    Func _BlacklistPatternCreate(ByRef $_aList, $_sMatchPattern)
        If Not IsArray($_aList) Then Return $_sMatchPattern
        Local $sPattern
        For $i = 0 To UBound($_aList) -1
            $sPattern &= StringFormat('%s|', $_aList[$i])
        Next
        $sPattern = StringTrimRight($sPattern, 1)
        ; z.B.  "\b(?:Peter|Paul|Maria)\b(*SKIP)(*FAIL)|([a-zA-ZäöüÄÖÜß]+)"
        $sPattern = StringFormat('\b(?:%s)\b(*SKIP)(*FAIL)|(%s)', $sPattern, $_sMatchPattern)
        Return $sPattern
    EndFunc
    Alles anzeigen

    In diesem Fall ergibt sich folgendes Pattern:

    "\b(?:Peter|Paul|Maria)\b(*SKIP)(*FAIL)|([a-zA-ZäöüÄÖÜß]+)"

    Gehen wir es Schritt für Schritt durch:

    - auf der linken Seite sind die Blacklistwerte, Pipe-getrennt

    \b(?:Peter|Paul|Maria)\b  - die Begriffe müssen als ganzes Wort gefunden werden (Paul matcht nicht Paula)

    \b(?:Peter|Paul|Maria)\b - die Begriffe der Blacklist werden nicht in einem Capture aufgefangen

    \b(?:Peter|Paul|Maria)\b - die Begriffe durch Pipe als ODER-Abfrage

    (*SKIP)(*FAIL)  - die Anweisung den Match zu überspringen und zu ignorieren

    - auf der rechten Seite das Pattern für die abzufragenden Einträge

    ([a-zA-ZäöüÄÖÜß]+) - das Ergebnis in einem Capture

    ([a-zA-ZäöüÄÖÜß]+) - Zeichenklasse, alle Zeichen dürfen mehrfach auftreten

    ([a-zA-ZäöüÄÖÜß]+) - alle Buchstaben des deutschen Alphabets

    Ich finde diese Variante hochinteressant. Vielleicht könnt ihr ja auch was damit anfangen.

  • Diskussion über den Thread : "Reguläre Ausdrücke Sammlung"

    • BugFix
    • 21. November 2018 um 19:06
    Zitat von fakeraol

    Es ging mir nicht mal um Optimierung, nur darum ob das die gleiche Wirkung hat.

    Nicht ganz, kommt auf die vermutete Ausgangssituation an.

    Annahme 1: Teststring beginnt mit Leerzeichen - Ja, dann ist die Wirkung identisch.

    Annahme 2: Vor dem Laufwerksbuchstaben ist ein anderes als ein Leerzeichen - Dann funktioniert es nur mit dem Lookbehind.

    Da ich alle Fehlersituationen berücksichtigen wollte, ist somit der Lookaround das Mittel der Wahl.

    Hier mal zum Prüfen:

    Test
    Code
    Global $sTestGood = 'C:\'
    Global $sTestFalse = ' C:\'
    
    Global $PattLookBehind = '(?<!.)([a-zA-Z]\:\\)'
    Global $PattStartToken = '^([a-zA-Z]\:\\)'
    
    ConsoleWrite('Test good string' & @CRLF)
    ConsoleWrite('Lookbehind: ' & StringRegExp($sTestGood, $PattLookBehind, 1)[0] & @CRLF)
    ConsoleWrite('StartToken: ' & StringRegExp($sTestGood, $PattStartToken, 1)[0] & @CRLF & @CRLF)
    
    ConsoleWrite('Test false string' & @CRLF)
    Global $aResult = StringRegExp($sTestFalse, $PattLookBehind, 1)
    If Not IsArray($aResult) Then
        ConsoleWrite('Lookbehind: NO MATCH - correct.' & @CRLF)
    Else
        ConsoleWrite('Lookbehind: ' & $aResult[0] & ' - wrong pattern!' & @CRLF)
    EndIf
    $aResult = StringRegExp($sTestFalse, $PattStartToken, 1)
    If Not IsArray($aResult) Then
        ConsoleWrite('StartToken: NO MATCH - correct.' & @CRLF)
    Else
        ConsoleWrite('StartToken: ' & $aResult[0] & ' - wrong pattern!' & @CRLF)
    EndIf
    Alles anzeigen
  • Diskussion über den Thread : "Reguläre Ausdrücke Sammlung"

    • BugFix
    • 21. November 2018 um 09:01
    Zitat von fakeraol

    Könnte man in Deinem Beispiel statt dem ersten Lookaround nicht einfach ein ^ verwenden?

    Ein Lookaround "frisst" das abgefragte Zeichen nicht, soweit ich weiß? D. h., ein unmittelbar danach stehender String, der mit diesem Zeichen beginnt, kann trotzdem gefunden werden?

    Das Bsp. ist sicher vor keiner Optimierung gefeit. :D

    Mit meinem heutigen Kenntnis- und Erfahrungsstand würde ich vermutlich das Pattern anders gestalten. Inzwischen ist die Negation das von mir meistgenutzte Token.

    Aber, wie allen bekannt, führen viele Wege nach Rom - aber noch mehr zu einem gültigen Pattern. Die Wahrscheinlichkeit, dass zwei Personen ein komplexes Problem mit dem identischen Pattern lösen, ist relativ gering. Das haben wir schon häufig festgestellt. ;)^

    EDIT:

    Ich möchte euch meine Lieblings-Regex-Tut-Seite empfehlen, sehr gute Tuts und Bsp.: Rex Egg

  • Diskussion über den Thread : "Reguläre Ausdrücke Sammlung"

    • BugFix
    • 20. November 2018 um 15:15
    Zitat von fakeraol

    gepostete Pattern als Einstieg für eigene Lösungen - Da sehe ich das Problem, daß sich der Hund in den Schwanz beißt

    Dann habe ich mich unklar ausgedrückt. Ich würde von mir schon sagen, dass ich fit bin mit RegEx. Aber einige Aufgabenstellungen verwende ich extrem selten (z.B. rekursive Pattern), da ist es dann praktisch ein Bsp. zu haben, das die richtige Verwendung aufzeigt.

    Und einige Pattern sind einfach nur reine Schreibarbeit (z.B. IP-Gültigkeit), da übernehme ich gern ein bereits existierendes, wobei ich schon die Arbeitsweise nachvollziehen kann. Das ist etwas, was natürlich jeder Einsteiger auch als Ziel haben muss - zu Erkennen, warum das Pattern zur Lösung führt.

    Letztlich versteht sich die Sammlung, wie eigentlich alles hier im Forum, als Hilfe zur Selbsthilfe. Wer nur mit C&P arbeitet wird auf lange Sicht eh Schiffbruch erleiden.

  • Diskussion über den Thread : "Reguläre Ausdrücke Sammlung"

    • BugFix
    • 20. November 2018 um 11:58
    Zitat von fakeraol

    Dann ist wohl Groß- und Kleinschreibung und richtige Zeichensetzung auch Erbsenzählerei.

    Da bin ich absolut derselben Meinung. In allgemeiner Umgangssprache mag Ziffer und Zahl mal verwechselt werden, aber in einer syntaktischen Beschreibung ist das irreführend, da falsch. In gewissen Bereichen bin ich ein 'Korinthenkacker' :P. In Erläuterungen, Anweisungen etc. sind Worte mit absoluter Sorgfalt und der richtigen Begrifflichkeit zu verwenden. Da bin ich auch dankbar, wenn mir dabei ein Lapsus passiert und mich jemand drauf aufmerksam macht.

    Zitat von fakeraol

    Ehe ich mich in die RegExe von anderen reindenke, kann ich sie auch selber schreiben. Ich verwende ungern Zeug, von dem ich nicht verstehe, wie es funktioniert.

    Kann ich absolut nachvollziehen. Würde ich auch mal als Anregung nehmen, dass wir zur Qualitätssteigerung die geposteten Lösungen mehrfach verifizieren.

    Wobei ich ergänzen möchte, dass die geposteten Pattern auch einen guten Einstieg für eigene Lösungen bieten können. Ihr wisst ja: Der Wald und lauter Bäume. Besonders, wenn man mit einem Problem selten zu tun hat, ist man dankbar einen Lösungsansatz zu finden.

    Zitat von Musashi

    Natürlich ist *s??g.txt ein Regulärer Ausdruck

    Da muss ich widersprechen. Ein regulärer Ausdruck kann niemals mit einem Quantifier beginnen. Ein Quantifier bezieht sich immer auf den voranstehenden Ausdruck. Steht nichts davor ist es kein regulärer Ausdruck.

  • GDIPlus Klick auf Objekt

    • BugFix
    • 19. November 2018 um 08:49

    :Face:Oops, da hatte ich wohl einen Blackout.

  • GDIPlus Klick auf Objekt

    • BugFix
    • 18. November 2018 um 23:16

    GUIGetMsg(1) gibt ein Array mit 2 Werten zurück. An [0] ist das Event und an [1] das Control. Du musst also auf das Event und das Control prüfen.

  • ListView füllen und ProgressBar

    • BugFix
    • 18. November 2018 um 23:09

    Kleiner Workaround:

    Lade erst mal etwa das 3-fache des sichtbaren Bereiches (vermutlich etwa <200 Einträge) . Das lässt du anzeigen und beginnst anschließend mit dem Laden des Restes. Die Gesamtzeit bleibt natürlich gleich, aber optisch sieht es nach gut 1s schon geladen aus.

  • Reguläre Ausdrücke Sammlung

    • BugFix
    • 17. November 2018 um 13:03

    fakeraol:

    Bitnugger hat ja schon darauf hingewiesen: Dieser Thread ist, wie schon der Titel "Reguläre Ausdrücke Sammlung" vermuten läßt, eine Zusammenstellung unserer geistigen Aktivitäten zu diesem Thema.

    Was ist der Sinn einer Sammlung? Na sonnenklar: Jeder kann sich dort bedienen, ohne selbst das Rad neu erfinden zu müssen. Deiner Logik nach, sollten wir dann die UDF aus den Includes entfernen, weil es hilfreicher ist, dass sich jeder eine eigene Lösung zu häufigen Problemen bastelt?! :Face:

    Ich glaube, du hast noch nicht verinnerlicht, aus welchem Grunde wir dieses Forum gestalten.

  • Forenupdate - November 2018 - Probleme / Anregungen / Feedback - Sammelthread

    • BugFix
    • 16. November 2018 um 18:36

    Die Avatare der meisten User sind nicht mehr vorhanden - sind die noch in der Datenbank und nur nicht verknüpft - oder endgültig verloren?

  • Shoutbox weg?

    • BugFix
    • 13. November 2018 um 08:32

    Mein Avatar ist auch weg, ich habe auch keine Möglichkeit auf mein Kontrollzentrum (genauer - "Mein Profil") zuzugreifen - endet mit Fatal Error:

    Interner Fehlercode: 991c6423e87317c58c3ba1f2f6bc6a24b2303fd5

    Error Type:

    wcf\system\exception\InvalidObjectTypeException

    Error Message:

    Invalid object type 'com.woltlab.wcf.comment' for definition 'com.woltlab.wcf.message'.

    Sind wohl noch einige "Würmer" drin. ;)

  • OrdnerNeu mit Namen nach Formatierungsvorgabe

    • BugFix
    • 8. November 2018 um 19:30

    Ich habe bei mir regelmäßig wiederkehrende Aufgaben, deren Ergebnisse in neuen Ordnern abgelegt werden. Diese Ordner haben immer einen Bezug zum Datum (als Sortierkriterium) und optional beschreibenden Text. Um nicht jedes mal händisch den Ordnernamen erstellen zu müssen, hatte ich im jeweiligen Root-Verzeichnis eine AutoIt-Datei, die bei Ausführung den gewünschten Ordner erstellt. Nachdem ich das in 3 Variationen hatte, entschied ich mich eine flexible Lösung zu erstellen, in der die Datei aus ihrem Namen heraus den Befehl zur Formatierung des neuen Ordners erhält. Herausgekommen ist dabei der folgende Code. Vielleicht kann das auch für jemand anderen nützlich sein.

    AutoIt
    ;-- TIME_STAMP   2018-11-08 19:11:51
    
    #cs
    Als "OrdnerNeu_.exe" kompilieren (oder ähnlich).
    Alle Zeichen bis inkl. des ersten '_' werden für den neuen Ordnernamen ignoriert.
    Für den jeweiligen Bedarf wird dann eine Formatierungsregel hinter dem '_' angefügt.
    Enthält der Dateiname keinen Formatstring nach dem '_', wird als Standard 'JJJJ-MM-DD' verwendet.
    Hier die einsetzbaren Variablen, die eigenständig Datumsoperationen veranlassen:
        JJJJ - Jahr aktuell vierstellig
        JJJj - Jahr (aktuelles Jahr -1) vierstellig
        jjjJ - Jahr (aktuelles Jahr +1) vierstellig
        JJ   - Jahr aktuell zweistellig
        Jj   - Jahr (aktuelles Jahr -1) zweistellig
        jJ   - Jahr (aktuelles Jahr +1) zweistellig
        MM   - Monat aktuell
        Mm   - Monat (aktueller Monat -1, ggf. Anpassung Jahr erfolgt automatisch)
        mM   - Monat (aktueller Monat +1, ggf. Anpassung Jahr erfolgt automatisch)
        DD   - Tag aktuell
        Dd   - Tag (Heute -1, ggf. Anpassung Monat und Jahr erfolgt automatisch)
        dD   - Tag (Heute +1, ggf. Anpassung Monat und Jahr erfolgt automatisch)
    Trennzeichen zwischen den Datumsteilen sind beliebig und optional, ausgenommen für Dateinamen nicht zulässige Zeichen:  \ / : * ? " < > |
    Zusätzlicher Text ist in eckigen Klammern einzufügen.
    Evtl. eckige Klammern innerhalb des Textes sind mit sich selbst zu maskieren.
    
    Beispiele
    DATUM-HEUTE   DATEINAME                                    NAME-DES-NEUEN-ORDNERS
    2016/03/01    OrdnerNeu_[Sicherung ]JJJJ-MM-Dd.exe         'Sicherung 2016-02-29'
    2016/03/01    OrdnerNeu_[[[Sicherungen]]]JJJJ-Mm.exe       '[Sicherungen]2016-02'
    2018/10/06    OrdnerNeu_[[[Fotos]]]JJJJ-mM.exe             '[Fotos]2018-11'
    2018/11/01    OrdnerNeu_JJJJ_MM_DD.exe                     '2018_11_01'
    2018/11/10    OrdnerNeu_.exe == OrdnerNeu_JJJJ-MM-DD.exe   '2018-11-10'
    #ce
    
    
    #include <Date.au3>
    
    _CreateFolderFromFilename()
    
    Func _CreateFolderFromFilename()
        Local $sFile = @ScriptName
    
        ; Format-String abschneiden
        Local $iPos = StringInStr($sFile, '_')
        If $iPos = 0 Then Exit MsgBox(16, 'FEHLER', '"_" nicht im Dateinamen.')
        Local $sFolder = StringTrimLeft($sFile, $iPos)
        $sFolder = StringLeft($sFolder, StringInStr($sFolder, '.', 0, -1) -1)
        If $sFolder = '' Then $sFolder = 'JJJJ-MM-DD'
    
        ; Klammern innerhalb von Text maskieren
        $sFolder = StringReplace(StringReplace($sFolder, '[[', Chr(1), 0, 1), ']]', Chr(2), 0, 1)
    
        ; evtl. Text separieren
        Local $sText, $aTextPart = StringRegExp($sFolder, '\[([^]]+)]', 1)
        If Not @error Then
            $sText = $aTextPart[0]
            ; ersetzen mit "T"
            $sFolder = StringReplace($sFolder, '[' & $sText & ']', 'T')
        Else
            $sText = ''
        EndIf
    
        ; aktuelle Datumswerte
        Local $iYear = @YEAR, $iMonth = @MON, $iDay = @MDAY
    
        ; Angaben aus Formatstring abfragen
        Local $sYear = '', $sMon = '', $sDay = '', $sTmp
        Local $aRet = StringRegExp($sFolder, '([Jj]+)', 1)
        If Not @error Then $sYear = $aRet[0]
        $aRet = StringRegExp($sFolder, '([Mm]+)', 1)
        If Not @error Then $sMon = $aRet[0]
        $aRet = StringRegExp($sFolder, '([Dd]+)', 1)
        If Not @error Then $sDay = $aRet[0]
    
        ; Datumswerte bilden
        Local $sTmp = StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay)
        If ($sYear == 'JJJj') Or ($sYear == 'Jj') Then $sTmp = _DateAdd('Y', -1, StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay))
        If ($sYear == 'jjjJ') Or ($sYear == 'jJ') Then $sTmp = _DateAdd('Y', +1, StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay))
        If $sMon == 'Mm' Then $sTmp = _DateAdd('M', -1, StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay))
        If $sMon == 'mM' Then $sTmp = _DateAdd('M', +1, StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay))
        If $sDay == 'Dd' Then $sTmp = _DateAdd('D', -1, StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay))
        If $sDay == 'dD' Then $sTmp = _DateAdd('D', +1, StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay))
        $iYear = StringRegExpReplace($sTmp, '(\d{4})/\d{2}/\d{2}', '\1')
        $iMonth = StringRegExpReplace($sTmp, '\d{4}/(\d{2})/\d{2}', '\1')
        $iDay = StringRegExpReplace($sTmp, '\d{4}/\d{2}/(\d{2})', '\1')
    
        ; und im Formatstring ersetzen
        $sFolder = StringReplace($sFolder, 'JJJJ', $iYear)
        $sFolder = StringReplace($sFolder, 'JJJj', $iYear)
        $sFolder = StringReplace($sFolder, 'jjjJ', $iYear)
        $sFolder = StringReplace($sFolder, 'JJ', StringRight($iYear, 2))
        $sFolder = StringReplace($sFolder, 'Jj', StringRight($iYear, 2))
        $sFolder = StringReplace($sFolder, 'jJ', StringRight($iYear, 2))
        $sFolder = StringReplace($sFolder, 'MM', StringFormat('%02i', $iMonth))
        $sFolder = StringReplace($sFolder, 'Mm', StringFormat('%02i', $iMonth))
        $sFolder = StringReplace($sFolder, 'mM', StringFormat('%02i', $iMonth))
        $sFolder = StringReplace($sFolder, 'DD', StringFormat('%02i', $iDay))
        $sFolder = StringReplace($sFolder, 'Dd', StringFormat('%02i', $iDay))
        $sFolder = StringReplace($sFolder, 'dD', StringFormat('%02i', $iDay))
    
        ; falls zusätzlicher Text vorhanden -> wiederherstellen
        If $sText <> '' Then
            $sFolder = StringReplace($sFolder, 'T', $sText)
            ; evtl. Klammern innerhalb Text wiederherstellen
            $sFolder = StringReplace(StringReplace($sFolder, Chr(1), '[', 0, 1), Chr(2), ']', 0, 1)
        EndIf
    
        ; Ordner als Unterordner von @ScriptDir erstellen
        $sFolder = StringFormat('%s\%s', @ScriptDir, $sFolder)
        If Not FileExists($sFolder) Then DirCreate($sFolder)
    EndFunc
    Alles anzeigen
  • Differenz zwischen 2 Datumswerten - ABER - Ergebnis gesucht in: Jahren, Monaten, Tagen, Stunden, Minuten und Sekunden

    • BugFix
    • 28. Oktober 2018 um 11:30

    Das Problem reduziert sich doch eigentlich auf die Berücksichtigung möglicher Schaltjahre. Ich würde so vorgehen (Start < Ende) :

    - Differenz Tage bis Jahresende

    - Anzahl Jahre bis Jahr Ende

    - Anzahl Tage im Endjahr

    Evtl. Schaltjahre berücksichtigt _DateDiff.

    Das einzige NICHT lösbare Problem entsteht, wenn die Summe der Tage (Rest Start + Tage in Ende) 365 überschreitet. Das ergibt kein reales Jahr + Resttage, sondern ein fiktives Jahr. Und das kannst du eigentlich nur mit der Länge eines Normaljahres veranschlagen.

    Wegen solcher Unwägbarkeiten hat sich zum Bsp. die Finanzwelt das 360 Tage Jahr (12 Monate a 30 Tage) geschaffen.

  • Internet sperren für Prüfungssituationen

    • BugFix
    • 26. Oktober 2018 um 19:39

    Ich erinnere mich gern an die Zeiten, als Software mit Dongle lizensiert wurde. Das wär doch was: Standardmäßig kein Browser auf dem PC, es wird nur einer installiert, der mit Dongle läuft. Dongle abstecken - Ruhe im Schiff. 8o

  • Datum umwandeln

    • BugFix
    • 24. Oktober 2018 um 14:11

    Hiermit gehts:

    AutoIt
    Global $sDate = "Oct 22, 2018 12:00:59 AM"
    ConsoleWrite(_Convert($sDate) & @CRLF)
    
    Func _Convert($_sDate)
        Local Static $aM[12][2] = [['Jan','01'],['Feb','02'],['Mar','03'],['Apr','04'],['May','05'],['Jun','06'],['Jul','07'],['Aug','08'],['Sep','09'],['Oct','10'],['Nov','11'],['Dec','12']]
        Local $aDate = StringRegExp($_sDate, '(\w{3})\s(\d{2}),\s(\d{4})\s(\d{2}):(\d{2}):(\d{2})\s(AM|PM)', 1)
        Local $iMon
        For $i = 0 To 11
            If $aM[$i][0] = $aDate[0] Then
                $iMon = $aM[$i][1]
                ExitLoop
            EndIf
        Next
        Local $iDay = $aDate[1], $iYear = $aDate[2], $iHour = $aDate[3], $iMin = $aDate[4], $iSec = $aDate[5]
        If $aDate[6] = 'PM' Then
            If $iHour < 12 Then $iHour += 12
        ElseIf $aDate[6] = 'AM' Then
            If $iHour = 12 Then $iHour = 0
        EndIf
        Return StringFormat('%i/%02i/%02i %02i:%02i:%02i', $iYear, $iMon, $iDay, $iHour, $iMin, $iSec)
    EndFunc
    Alles anzeigen
  • NTFS ACL Berechtigungen Anzeigen/Setzen

    • BugFix
    • 24. Oktober 2018 um 12:42

    PowerShell mit AutoIt:

    AutoIt
    Global $sPath = "C:\DEIN\VERZEICHNIS\"
    Global $sInclude = '' ; z.B. '*.au3', leer lassen für alles
    If $sInclude  <> '' Then $sInclude = StringFormat(' -include "%s" ', $sInclude)
    Global $sCmd = 'gci -Path ' & StringFormat('"%s"', StringReplace($sPath, ' ', '` ')) & $sInclude & _
                   ' -r | % {Get-Acl $_.FullName|select path, Owner, Group, Sddl} | fl'
    Global $sRet = _PowerShell_Run($sCmd, 1)
    ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & "   var: $sRet --> " & $sRet & @LF)
    
    
    Func _PowerShell_Run($_sCmd, $_iOutput=0)
        Local Const $sKey32 = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell"
        Local Const $sKey64 = "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell"
        Local Static $sKey = @CPUArch = 'X64' ? $sKey64 : $sKey32
        Local Static $sPSexe = RegRead($sKey, 'Path')
        Local $sPathTMP = StringFormat('%s\__%s%s%s%s%s%s%s.ps1', @TempDir, @YEAR, @MON, @MDAY, @HOUR, @MIN, @SEC, @MSEC)
        Local $fH = FileOpen($sPathTMP, 2+8+128)
        FileWrite($fH, $_sCmd)
        FileClose($fH)
        Local $sRun = StringFormat('%s -ExecutionPolicy UnRestricted -File %s', $sPSexe, $sPathTMP)
        Local $sOut = '', $iPID = Run($sRun, @ScriptDir, @SW_HIDE, 0x2)
        If $_iOutput = 1 Then
            Do
                $sOut &= StdoutRead($iPID)
            Until @error
            StdioClose($iPID)
        Else
            While ProcessExists($iPID)
                Sleep(350)
            WEnd
        EndIf
        FileDelete($sPathTMP)
        Return ($_iOutput = 1 ? $sOut : 1)
    EndFunc
    Alles anzeigen
  • Variable / String auslesen und vergleichen klappt nicht

    • BugFix
    • 18. Oktober 2018 um 12:21
    Zitat von mirko2002

    Ich habe also die Variable schon durch StringToASCIIArray gejagt um zu prüfen ob noch weitere Zeichen wie @LR etc enthalten sind (was tatsächlich auch der Fall war und habe diese mit StringRight entfernt.

    Um solche (nicht sichtbaren) Anteile vor oder hinter dem eigentlichen Text zu beseitigen, kannst du einfacher StringStripWS verwenden.

  • Dummy-Drucker

    • BugFix
    • 3. Oktober 2018 um 09:26
    Zitat von Andy

    Es gibt beim Druckvorgang kein kein "RE0815.bla-Dokument"!

    OK, da bin ich dann von unserer knapp 20 Jahre alten WaWi-Software verwöhnt. Ich lasse jeden Ausdruck (unabhängig davon, welcher Drucker/Druckformat gewählt wird) parallel als PDF ausgeben (für meine ELO-Archivierung) und das erledigt die WaWi von allein mit "Belegtyp_BelegNr.pdf". Ich habe allerdings schon in der Reportvorlage definiert, welcher Report an welchen Drucker ausgegeben wird. Die Reports haben eine rudimentäre Basic-Schnittstelle mit einer Anweisung ::BeforePrint, die es ermöglicht z.B. Drucker belegtypabhängig zuzuweisen. Diese Flexibilität habe ich extra gesucht, als ich die Software gekauft hatte. Von Updates habe ich aber Abstand gehalten, denn diese verschlimmbessern eine Software erfahrungsgemäß. In der aktuellen Softwareversion könnte ich kaum noch automatisiert zugreifen.

  • Dummy-Drucker

    • BugFix
    • 2. Oktober 2018 um 09:35
    Zitat von chesstiger

    Erschwert wird das ganze noch durch die Tatsache, dass der PDF-Drucker nicht den Original-Dateinamen weitergeben kann.

    Was meinst du, mit "nicht weitergeben kann"?

    Der Dateiname wird für die PDF-Erstellung aber schon genutzt (aus Bsp. 'RE0815.doc' wird 'RE0815.pdf')? Das machen zumindest alle PDF-Printer die ich verwende (FreePDF, PDFCreator) automatisch. Und zum physischen Druck selektierst du doch anhand dieses Namens den Drucker und stößt den Jab an. Da ist doch nichts mehr weiterzugeben - oder verstehe ich das falsch?

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™