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

Beiträge von Bitnugger

  • Diskussion zu: FAQ SciTE Editor

    • Bitnugger
    • 24. Juli 2019 um 15:10

    Ich habe das Script geändert, damit es auch mit mehreren SciTE-Instanzen funktioniert.

    Zitat von BugFix

    If StringRegExp($__sTitle, 'SciTE( \[\d+ of \d+\])?$') Then

    So wird bei dem RegEx auch eine eingedeutschte Version berücksichtigt:

    If StringRegExp($sTitle, 'SciTE( \[\d+ (of|von) \d+\])?$') Then

    Mir ist auch aufgefallen, dass SciTE den Save-Button selbst nicht mehr aktiviert. Wenn SciTE_EnDisable_SaveBtn.au3 also beendet wird, muss der Save-Button in allen Instanzen wieder aktiviert werden, da er sonst nicht mehr nutzbar ist. Dafür kann man die von mir geänderte Version dann einfach mit dem Parameter /Exit aufrufen.

    Python
    ;-- TIME_STAMP   2019-07-24 14:12:24
    
    
    ; setzt Status des Toolbar-Button <SAVE> abhängig von Erfordernis zu speichern oder nicht auf ENABLE/DISABLE
    ; Skript kompilieren
    
    #NoTrayIcon
    
    #include <Misc.au3>
    #include <WinAPISys.au3>
    #include <GuiToolbar.au3>
    
    Opt('MustDeclareVars', 1)
    
    If Not @Compiled Then Exit 1
    
    Global $g_hUSER32 = DllOpen('user32.dll')
    
    ; Index des gewünschten Button ermitteln
    ; Die Trennstriche zählen mit! Gezählt wird bei 0 beginnend.
    ; Bsp. Button "Save": Davor liegt "Trenner", "NEW", "OPEN" --> "SAVE" ist das 4.te Element - somit Index "3"
    Global Const $g_iIndexSave = 3
    
    If $CMDLINE[0] And $CMDLINE[1] = '/Exit' Then _SciTE_EnDisable_SaveBtn_Exit()
    
    _Singleton('SciTE_EnDisable_SaveBtn') ; Enforce a design paradigm where only one instance of the script may be running
    
    While Sleep(500)
        _CheckAndSetState()
    WEnd
    Exit
    
    
    Func _CheckAndSetState()
        Local $hScite, $sTitle, $iBtnState, $iNewState, $hWndToolbar, $idCmd, $aResult
    
        $hScite = WinGetHandle('[ACTIVE]')
        $aResult = DllCall($g_hUSER32, "int", "GetClassNameW", "hwnd", $hScite, "wstr", "", "int", 4096)
        If Not @error And $aResult[2] = 'SciTEWindow' Then
            $hWndToolbar = ControlGetHandle($hScite, '', '[CLASS:ToolbarWindow32; INSTANCE:1]')
            $aResult = DllCall($g_hUSER32, "bool", "IsWindowVisible", "hwnd", $hWndToolbar)
            If Not @error And $aResult[0] Then
                $idCmd = _GUICtrlToolbar_IndexToCommand($hWndToolbar, $g_iIndexSave)
    
                $sTitle = WinGetTitle($hScite)
                If StringRegExp($sTitle, 'SciTE( \[\d+ (of|von) \d+\])?$') Then
                    $iBtnState = _GUICtrlToolbar_GetButtonState($hWndToolbar, $idCmd)
                    If Not StringInStr($sTitle, '*') And BitAND($iBtnState, $TBSTATE_ENABLED) Then
                        $iNewState = BitXOR($iBtnState, $TBSTATE_ENABLED)
                    ElseIf StringInStr($sTitle, '*') And Not BitAND($iBtnState, $TBSTATE_ENABLED) Then
                        $iNewState = BitOR($iBtnState, $TBSTATE_ENABLED)
                    Else
                        Return
                    EndIf
                    _GUICtrlToolbar_SetButtonState($hWndToolbar, $idCmd, $iNewState)
                EndIf
            EndIf
        EndIf
    EndFunc
    
    Func _SciTE_EnDisable_SaveBtn_Exit()
        Local $aWinList = WinList('[CLASS:SciTEWindow]'), $hWndToolbar, $idCmd, $iBtnState, $iNewState, $aProcessList = ProcessList(@ScriptName)
        For $i = 1 To $aProcessList[0][0] Step 1
            If $aProcessList[$i][1] <> @AutoItPID Then ProcessClose($aProcessList[$i][1])
        Next
        DllClose($g_hUSER32)
        For $i = 1 To $aWinList[0][0] Step 1
            $hWndToolbar = ControlGetHandle($aWinList[$i][1], '', '[CLASS:ToolbarWindow32; INSTANCE:1]')
            $idCmd = _GUICtrlToolbar_IndexToCommand($hWndToolbar, $g_iIndexSave)
            $iBtnState = _GUICtrlToolbar_GetButtonState($hWndToolbar, $idCmd)
            $iNewState = BitOR($iBtnState, $TBSTATE_ENABLED)
            If $iNewState <> $iBtnState Then _GUICtrlToolbar_SetButtonState($hWndToolbar, $idCmd, $iNewState)
        Next
        Exit
    EndFunc
    Alles anzeigen
  • Schrift Höhe/Länge anpassen

    • Bitnugger
    • 22. Juli 2019 um 17:41

    Schau mal ob dir das weiter hilft...

    C
    ;-- TIME_STAMP   2016-06-07 02:22:11   v 1.0
    
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <EditConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    
    Opt('MustDeclareVars', 1)
    
    Global Const $SS_EDITCONTROL = 0x00002000
    
    Global $FontName = "Courier New" ; Font mit fester Laufweite
    Global $FontSize = 9, $MinFontSize = 5
    Global $FontWeight = -1
    Global $FontAttr = -1
    Global $iMaxZeichenInZeile = 72 ; 140
    Global $iMaxLines = 3
    Global $sZeile = ""
    
    ; Wir bauen uns einen String mit der gewünschten Zeichenanzahl
     For $I = 1 To $iMaxZeichenInZeile
         If Mod($I, 10) Then
             $sZeile &= Mod($I, 10)
         Else
             $sZeile &= " "
         EndIf
     Next
    
    ;~ Global $sPlot = ClipGet()
    Global $sPlot = 'Setzt ein Flag, das festlegt, ob ein mehrzeiliges Bearbeitungssteuerelement weiche Zeilenumbruchzeichen enthält. Ein weicher Zeilenumbruch besteht aus zwei Zeilenumbrüchen und einem Zeilenvorschub und wird am Ende einer Zeile eingefügt, die aufgrund von Zeilenumbrüchen unterbrochen wurde.'
    
    ; Wir erstellen ein DUMMY GUI
    GUICreate("DUMMY")
    ; Wir setzen den gewünschten Font (mit fester Laufweite)
    GUISetFont($FontSize, $FontWeight, $FontAttr, $FontName)
    ; Wir schauen mal, wie breit ein Label sein muss, um den String aufzunehmen
    GUICtrlCreateLabel($sZeile, 0, 0, -1, -1, $SS_EDITCONTROL)
    Global $aLabel = WinGetClientSize(GUICtrlGetHandle(-1))
    ; Wir erzeugen ein Edit gleicher Breite und holen uns die realen Abmessungen der Clientarea
    GUICtrlCreateEdit($sZeile, 0, 0, $aLabel[0], 40, $ES_WANTRETURN + $WS_VSCROLL)
    Global $aEdit = WinGetClientSize(GUICtrlGetHandle(-1))
    ; Das DUMMY GUI hat seine Schuldigkeit getan
    GUIDelete()
    
    ; Die benötigte Breite des Edits entspricht der Breite des Labels
    ; zuzüglich der Differenz Labelbreite - Editbreite
    Global $iEditW = $aLabel[0] + $aLabel[0] - $aEdit[0]
    
    ; Jetzt erstellen wir das echte GUI
    Global $hGUI = GUICreate("Edit GUI", $iEditW, 330)
    ; Das Edit wird in der korrekten Breite für $iMaxZeichenInZeile erstellt
    Global $idEdit = GUICtrlCreateEdit($sPlot, 0, 0, $iEditW, 280, $ES_WANTRETURN + $WS_VSCROLL)
    ControlMove($hGUI, '', $idEdit, 0, 0, $iEditW, 280)
    ; Dem Edit wird der Font zugewiesen
    GUICtrlSetFont(-1, $FontSize, $FontWeight, $FontAttr, $FontName)
    ; ... und ein Button, der den Inhalt übernimmt
    Global $idBtn = GUICtrlCreateButton("Text holen", 110, 300, 300, 25)
    GUISetState()
    
    Global $aText
    While True
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $idBtn
                Do
                    ; Das Edit soll die "weichen" Zeilenumbrüche mit CRCRLF markieren
                    GUICtrlSendMsg($idEdit, $EM_FMTLINES, True, 0)
                    ; Wir holen uns den Inhalt
                    Local $sText = GUICtrlRead($idEdit)
                    ; Das Edit kann den Text jetzt wieder normal formatieren
                    GUICtrlSendMsg($idEdit, $EM_FMTLINES, False, 0)
                    ; Die "weichen" Zeilenumbrüche werden durch echte ersetzt
                    $sText = StringReplace($sText, @CR & @CRLF, @CRLF)
                    ConsoleWrite('> $FontSize = ' & $FontSize & @CRLF)
                    ConsoleWrite($sText & @CRLF & @CRLF)
                    $aText = StringSplit($sText, @CRLF, 3)
                    _ArrayDisplay($aText, '$aText')
                    If UBound($aText) <= $iMaxLines Then ExitLoop
                    $FontSize -= 0.5
                    GUICtrlSetFont($idEdit, $FontSize, $FontWeight, $FontAttr, $FontName)
    
                Until $FontSize <= $MinFontSize
        EndSwitch
    WEnd
    
    If UBound($aText) > $iMaxLines Then ConsoleWrite('! Text ist zu lang!' & @CRLF)
    Alles anzeigen
  • Kommandozeilen parsen ( _CmdLine_Parse )

    • Bitnugger
    • 19. Juli 2019 um 16:20
    Zitat von BugFix

    Ich habe hier ganz bewusst ausschließlich String-Funktionen verwendet, weil die API-Funktionen allesamt keine Abweichung vom Idealfall zulassen.

    Ja, in der Tat. Das hat @Musashi mit seinem Bsp. ja sehr gut verdeutlicht.

    Zwei Dinge an deinem Script würde ich aber noch ein wenig ändern.

    1.) Local $aExec[] = ['.exe','.com','.bat','.cmd','.scr']

    Hier solltest du besser die Umgebungsvariable PATHEXT auswerten.

    Local $aExec = StringSplit(EnvGet('PATHEXT'), ';', 2) ; Hehe, ist ja lustig... denn so funktioniert es nicht! --> Local $aExec[] = StringSplit(EnvGet('PATHEXT'), ';', 2)

    2.) Local $iMatch, $iPos = 1024, $sExt = ''

    Wenn ich es recht verstehe, gibst du mit $iPos die maximale Länge einer Befehlszeile vor. Die darf aber unter Windows XP und höher 8191 Zeichen und unter Windows 2000 oder Windows NT 4.0 2047 Zeichen lang sein.

    Local $iMatch, $iPos = @OSType = 'WIN32_NT' ? 8191 : 2047, $sExt = ''

  • Kommandozeilen parsen ( _CmdLine_Parse )

    • Bitnugger
    • 17. Juli 2019 um 22:53

    Was hältst du denn hiervon:

    C
    #include <Array.au3>
    #include <WinAPIShPath.au3>
    
    Local $aData = _WinAPI_CommandLineToArgv('C:\Program Files\Intel\bin\iWrap.exe /CMD:7 %1')
    ;~ _ArrayDisplay($aData, '_WinAPI_CommandLineToArgv')
    
    For $i = 1 To $aData[0] Step 1
        If _WinAPI_PathFindExtension($aData[$i]) = '' Then ContinueLoop
        $aData[0] = _ArrayToString($aData, ' ', 1, $i)
        _ArrayDelete($aData, '1-' & $i)
        ExitLoop
    Next
    _ArrayDisplay($aData, '$aData')
    Alles anzeigen
  • Probleme bei _WinAPI_Path... -Funktionen

    • Bitnugger
    • 16. Juli 2019 um 23:22
    Zitat von Musashi

    Es müsste eher vor dem inkonsistenten Verhalten von _WinAPI_AssocQueryString gewarnt werden.

    _WinAPI_AssocQueryString liest lediglich den zu dem Query korrespondierenden Registry-Schlüssel aus. Der Fehler liegt ergo beim Ersteller (User/Coder) des Registry-Schlüssels.

  • Probleme bei _WinAPI_Path... -Funktionen

    • Bitnugger
    • 16. Juli 2019 um 14:25
    Zitat von Musashi

    Hmm, das Beispiel aus der Hilfe zur Version 3.3.14.0 ergibt bei mir :

    Wenn der Pfad Leerzeichen enthält, muss er in Quote gesetzt werden, was bei deinem Bsp. ja auch der Fall ist.

    Mit AutoIt 3.3.14.5 bekomme ich mit .profile folgendes Ergebnis:

    $sCmd: C:\WINDOWS\system32\OpenWith.exe "%1"

    $sPath: C:\WINDOWS\system32\OpenWith.exe

    $sArgs: "%1"

    Mit .au3 folgendes Ergebnis:

    $sCmd: "C:\Program Files (x86)\AutoIt3\SciTE\SciTE.exe" "%1"

    $sPath: "C:\Program Files (x86)\AutoIt3\SciTE\SciTE.exe"

    $sArgs: "%1"

    Code
    Local $sCmd = 'C:\Program Files\Intel\bin\iWrap.exe /CMD:7 %1'
    ConsoleWrite('$sCmd: ' & $sCmd & @CRLF)    ; RICHTIG --> C:\Program Files\Intel\bin\iWrap.exe /CMD:7 %1
    $sCmd = _PathAddQuote($sCmd)
    ConsoleWrite('$sCmd: ' & $sCmd & @CRLF)    ; RICHTIG --> "C:\Program Files\Intel\bin\iWrap.exe" /CMD:7 %1
    
    Local $sPath = _WinAPI_PathRemoveArgs($sCmd)
    ConsoleWrite("$sPath: " & $sPath & @LF)    ; RICHTIG  --> "C:\Program Files\Intel\bin\iWrap.exe"
    $sPath = _WinAPI_PathUnquoteSpaces($sPath)
    ConsoleWrite("$sPath: " & $sPath & @LF)    ; RICHTIG  --> C:\Program Files\Intel\bin\iWrap.exe
    
    Local $sArgs = _WinAPI_PathGetArgs($sCmd)
    ConsoleWrite("$sArgs: " & $sArgs & @LF)    ; RICHTIG  --> /CMD:7 %1
    
    Func _PathAddQuote($sPath)
        Return StringLeft($sPath, 1) = '"' ? $sPath : StringRegExpReplace($sPath, '(?U)(.+\..+) (.+)', '"\1" \2')
    EndFunc
    Alles anzeigen

    Ausgabe:

    $sCmd: C:\Program Files\Intel\bin\iWrap.exe /CMD:7 %1

    $sCmd: "C:\Program Files\Intel\bin\iWrap.exe" /CMD:7 %1

    $sPath: "C:\Program Files\Intel\bin\iWrap.exe"

    $sPath: C:\Program Files\Intel\bin\iWrap.exe

    $sArgs: /CMD:7 %1

  • Gui automatisch schliessen nach ein paar Sekunden

    • Bitnugger
    • 10. Juli 2019 um 14:22
    Zitat von hipfzwirgel

    wie beende ich die While?

    ExitLoop ; Terminate a While/Do/For loop.

  • Lange Zeile mit vielen Anführungszeichen in cmd ausführen aus AutoIT heraus

    • Bitnugger
    • 6. Juli 2019 um 20:25

    So (etwas kürzer als die Version von Kanashius ) sollte es auch gehen:

    _RunDos('for /F "delims=" %I IN (''dir /B "%DriveLetter%:\Accuchek\Backup*"'') do rd /S /Q "%DriveLetter%:\Accuchek\%I" 2>nul')

    Ich frage mich nur, wann und wo die Umgebungsvariable %DriveLetter% gesetzt/aktualisiert wird... denn mit _RunDos wird ja eine neue Console geöffnet, welche dann eine Kopie der Umgebungsvariablen des AutoIt-Scripts erhält - es könnte also sein, dass %DriveLetter% in der neuen Console noch nicht deklariert wurde.

    Noch ein Tip: Parameter würde ich immer 1:1 übernehmen... denn je nach Befehl ist z.B. /f ist nicht unbedingt gleichbedeutend mit /F!

  • Bildschirmausschnitt als bmp zum Drücken

    • Bitnugger
    • 3. Juli 2019 um 15:55

    Meine Glaskugel hat fluchtartig den Raum verlassen, nachdem ich ihr deine Problembeschreibung vorgelesen habe. Ich kann es ihr nicht übel nehmen, denn die ist wirklich erbärmlich und an deinem Deutsch solltest du auch arbeiten.

    Um welches Programm handelt es sich und was willst du da drücken bzw. welche Aktion soll ausgelöst werden? Willst du etwa einen Bot schreiben? Ein Bild des Programms und dem was du drücken willst, wäre hilfreich.

    In den allermeisten Fällen ist der Weg über imageSearch der denkbar schlechteste Lösungsweg.

  • StdoutRead-Beispiel @CRLF

    • Bitnugger
    • 1. Juli 2019 um 00:33
    Zitat von Professor Bernd

    Übrigens, warum wird der frei gegebene Ordner nicht mit einem Icon versehen? (Win 10)

    Evtl. weil er leer ist?

  • Vorstellung

    • Bitnugger
    • 1. Juli 2019 um 00:27

    Erst einmal ein: Herzlich Willkommen hier im Forum!

    Von AutoHotkey auf AutoIt umsteigen... hm, beide Sprachen haben ihre Existenzberechtigung... AutoHotkey ist sicher besser als AutoIt für Dinge geeignet, die mit Keys zu tun haben, z.B. HotStrings, für alle anderen Sachen bevorzuge ich AutoIt.

  • StdoutRead-Beispiel @CRLF

    • Bitnugger
    • 1. Juli 2019 um 00:12
    Zitat von Professor Bernd

    Dann kommt das hier.

    Ok, das sieht gut aus... dann vermute ich mal, dass du keine einzige Freigabe (Datei/Ordner) auf deinem Rechner aktiviert hast und dein Rechner deshalb nicht in der Übersicht angezeigt wird.

    Hier habe ich die Ordner mal rot markiert, die ich bei mir freigegeben habe... gib also mal einen Ordner oder eine Datei frei, dann sollte dein Rechner in der Übersicht angezeigt werden.

    net_share.png

    Zitat von Professor Bernd

    Kann es vielleicht sein, dass man die Funktionalität der Powershell erst irgendwo freischalten muss?

    Nur wenn du Skripte ausführen willst...

    https://www.computerweekly.com/de/tipp/Tipps-…rungsrichtlinie

  • StdoutRead-Beispiel @CRLF

    • Bitnugger
    • 30. Juni 2019 um 23:33
    Zitat von Professor Bernd

    Warum dein Script dann nur "... False" anzeigt, kann ich gerade nicht sagen.

    Was bekommst du denn für eine Ausgabe/Fehlermeldung, wenn du in der Eingabeaufforderung net view eingibst?

  • Mit Send Befehlkopieren

    • Bitnugger
    • 30. Juni 2019 um 23:23

    Hallo Stefan,

    zuerst einmal würde ich die YT-Videos nicht als Lifestream abspielen, da du so immer Werbung mit dabei hast und somit zusätzliche Arbeit auf dich nimmst, um diese zu übergehen, was sicher nicht ganz einfach ist, da sich die Werbung jederzeit ändern kann.

    Mit JDownloader 2 (JD) kannst du dir die Videos (inkl. Only-Audio (*.mp4) und Untertitel (*.srt) plus Beschreibung (*.txt)) einzeln oder auch alle in einem Rutsch einmalig downloaden und hast sie dann fortan ohne Werbung offline verfügbar, wobei du sogar noch angeben kannst, in welcher Qualität du die Videos haben willst, insofern verfügbar. Um die Videos mit JD zu downloaden, brauchst du nur den oder die Links unter Linksammler eingeben. JD ermittelt dann automatisch alle Dateien, die unter diesem Link verfügbar sind. Was du nicht brauchst, entfernst du einfach aus der Liste und startest dann denn Download der Dateien.

    Installer: JDownloader 2 Clean Installers (No Adware!)

    Portable: JDownloader Portable Apps

    PS: Ich bevorzuge die Portable.

    Falls du Hilfe bei der Konfiguration von JDownloader 2 braucht, kannst du dich gerne an mich wenden.


    JD2.png

    Um die Videos mit AutoIt abzuspielen und dabei auch die Länge und die aktuelle gespielte Zeit zu ermitteln, kann ich dir die VLC-UDF empfehlen... siehe Anhang. Das Example habe ich extra für dich noch ein wenig angepasst.

    Dateien

    VLC UDF (@seangriffin - www.autoitscript.com).zip 7,58 kB – 320 Downloads
  • StdoutRead-Beispiel @CRLF

    • Bitnugger
    • 30. Juni 2019 um 16:00
    Zitat von Professor Bernd

    Bis dahin nur kurz eine Antwort zum SMB 1.0, das ist bei mir aktiviert. Das weiß ich, weil ich es extra für meine FritzBox aktiviert habe.

    SMB 1.0/CIFS automatisch entfernen

    Hier würde ich dann aber den Haken rausnehmen, denn damit erlaubst du Windows, das Protokoll automatisch zu entfernen, wenn es 15 aufeinanderfolgende Tage nicht benutzt wurde.

    Ob es aktiviert ist, kannst du z.B. so testen:

    Get-WindowsOptionalFeature.png

    Erkennen: Get-WindowsOptionalFeature –Online –FeatureName SMB1Protocol

    Deaktivieren: Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol

    Aktivieren: Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol

    Quelle: https://support.microsoft.com/de-de/help/269…-windows-server

  • PassIt2 1.1.0 - Dateien zwischen PCs einfach und bequem übertragen!

    • Bitnugger
    • 28. Juni 2019 um 18:15

    Windows Defender Firewall mit erweiterter Sicherheit (Win 10) hat die PassIt2Worker.exe als Trojaner erkannt und in Quarantäne geworfen... PassIt2.exe merkt zwar, dass die PassIt2Worker.exe nicht auffindbar ist, doch das Symbol für den Button wird trotzdem so geändert, als wenn er gestartet worden wäre.

  • StdoutRead-Beispiel @CRLF

    • Bitnugger
    • 28. Juni 2019 um 17:19
    Zitat von Professor Bernd

    Tut mir leid, aber da blicke ich nicht durch.

    Ich habe das jetzt noch mal so gut ich kann aufgebröselt und mit Kommentaren versehen...beide Funktionen machen quasi dasselbe.

    C
    ;-- TIME_STAMP   2019-06-25 23:15:03   v 1.0
    
    #include <Array.au3>
    
    Opt('MustDeclareVars', 1)
    
    Global $g_sShare
    
    $g_sShare = _Test1(@ComputerName)
    ConsoleWrite('> _Test1: $g_sShare = "' & $g_sShare & '"' & @CRLF)
    $g_sShare = _Test2(@ComputerName)
    ConsoleWrite('- _Test2: $g_sShare = "' & $g_sShare & '"' & @CRLF)
    
    Func _Test1($_sServername) ; Parameter beginnen immer mit "$_"
        Local $iIndex, $aOutput, $iPID = Run('net view', '', @SW_HIDE, $STDOUT_CHILD)
        ProcessWaitClose($iPID)
        $aOutput = StringRegExp(StdoutRead($iPID), '(.+)\R?', 3) ; @CR|@LF|@CRLF als Trennzeichen verwenden.
        ; ( ... )  ; Capturing group. Das was in den Klammer ist, wollen wir haben.
        ; .+       ; . steht für ein beliebiges Zeichen, + für 1 oder mehr.
        ; \R?      ; \R matcht "(?>\r\n|\n|\r)" eg. @CRLF|@LF|@CR, ? macht \R optional, es kann ein Trennzeichen vorhanden sein, muss es aber nicht - dann wird der komplette String genommen.
        ; , 3      ; $STR_REGEXPARRAYGLOBALMATCH (3) Return array of global matches.
        $iIndex = _ArraySearch($aOutput, '\\' & $_sServername, 0, 0, 0, 1)
        Return @error ? False : StringStripWS(_ArrayToString(_ArrayExtract($aOutput, $iIndex, $iIndex)), $STR_STRIPTRAILING)
    EndFunc  ;==>_Test1
    
    Func _Test2($_sServername) ; Parameter beginnen immer mit "$_"
        ; NET VIEW zeigt eine Liste der Computer oder der von einem Computer freigegebenen Ressourcen an.
        Local $sTrennzeichen, $iIndex, $sOutput, $aOutput[1], $iPID = Run('net view', '', @SW_HIDE, $STDOUT_CHILD)
        ProcessWaitClose($iPID)
        $sOutput = StdoutRead($iPID)
        ; Problematisch wird es mit StringSplit aber, wenn $sOutput gemischte Trennzeichen für die Zeilenumbrüche enthält, was mit StringRegExp aber kein Problem ist!
        Switch True
            Case StringInStr($sOutput, @CRLF)
                $sTrennzeichen = @CRLF ; @CRLF als Trennzeichen verwenden
            Case StringInStr($sOutput, @CR)
                $sTrennzeichen = @CR ; @CR als Trennzeichen verwenden
            Case StringInStr($sOutput, @LF)
                $sTrennzeichen = @LF ; @LF als Trennzeichen verwenden
            Case Else
                $aOutput[0] = $sOutput ; $sOutput enthält nur eine Zeile
        EndSwitch
        If $sTrennzeichen Then $aOutput = StringSplit($sOutput, $sTrennzeichen, BitOR($STR_ENTIRESPLIT, $STR_NOCOUNT)) ; @CR|@LF|@CRLF als Trennzeichen verwenden
        $iIndex = _ArraySearch($aOutput, '\\' & $_sServername, 0, 0, 0, 1) ; $_sServername im Array suchen
        If @error Then Return False ; $_sServername nicht in gefunden!
        Return StringStripWS(_ArrayToString(_ArrayExtract($aOutput, $iIndex, $iIndex)), $STR_STRIPTRAILING) ; Zeile aus dem Array extrahieren, als String konvertieren und alle Leerzeichen am Ende eliminieren.
    EndFunc  ;==>_Test2
    Alles anzeigen
    Zitat von Professor Bernd

    Edit: Übrigens, die Ausgabe des Scripts ist: $g_sShare = "False"

    Dann ist bei dir evtl. SMBv1 deaktiviert... und die Ausgabe von net view liefert bei dir dann einen Fehler... so sollte sie in etwa aussehen:


    net_view.png

  • StdoutRead-Beispiel @CRLF

    • Bitnugger
    • 27. Juni 2019 um 19:27
    Zitat von Professor Bernd

    Auf jeden Fall danke für die Tipps!

    Und zu Zeile 13 sagst du nichts? 8o

    $aOutput = StringRegExp(StdoutRead($iPID), '(.+)\R?', 3) ; @CR|@LF|@CRLF als Trennzeichen verwenden

  • StdoutRead-Beispiel @CRLF

    • Bitnugger
    • 27. Juni 2019 um 18:44

    Damit globale Variablen innerhalb einer Funktion nicht ausgehebelt werden, was der Fall wäre, wenn eine lokale Variable mit gleichem Namen deklariert wird, beginnen bei mir alle globale Variablen mit $g_, denn dann passiert sowas nicht. Zudem habe ich mir von BugFix folgende Form abgekupfert, um Parameter optisch leichter von globalen/lokalen Variablen unterscheiden zu können: $_sParam1

    C
    ;-- TIME_STAMP   2019-06-25 23:15:03   v 1.0
    
    #include <Array.au3>
    
    Opt('MustDeclareVars', 1)
    
    Global $g_sShare = _Test(@ComputerName)
    ConsoleWrite('$g_sShare = "' & $g_sShare & '"' & @CRLF)
    
    Func _Test($_sServername) ; Parameter beginnen immer mit "$_"
        Local $iIndex, $aOutput, $iPID = Run('net view', '', @SW_HIDE, $STDOUT_CHILD)
        ProcessWaitClose($iPID)
        $aOutput = StringRegExp(StdoutRead($iPID), '(.+)\R?', 3) ; @CR|@LF|@CRLF als Trennzeichen verwenden
        $iIndex = _ArraySearch($aOutput, '\\' & $_sServername, 0, 0, 0, 1)
        Return @error ? False : StringStripWS(_ArrayToString(_ArrayExtract($aOutput, $iIndex, $iIndex)), $STR_STRIPTRAILING)
    EndFunc
    Alles anzeigen
  • FaceDetection UDF

    • Bitnugger
    • 25. Juni 2019 um 23:04
    Zitat von Andy

    das hängt an der Abfrage der Struct in der Funktion _FD_Detect()

    Sehr schön - so funktioniert es!

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™