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

  • RunWait

    • Bitnugger
    • 9. August 2016 um 23:56

    So... ich habe jetzt noch ein paar Dinge geändert und bin mir nun ziemlich sicher, dass es jetzt funktioniert. :rofl:

    Vorab noch ein paar Infos...

    • Wenn das Script bei dir unkompiliert (*.au3) nicht funktioniert, dann musst du das Script als 64-bit-Anwendung kompilieren und dann die PostgreSQL_DUMP_x64.exe starten. Die dafür nötigen 'Directives' für den AutoIt3Wrapper habe ich bereits gesetzt.
    • Schmiert AutoIt bei dir wieder ab, dann starte das Script mal als Administrator (Als Administrator ausführen via Kontextmenü).
    • Geht es immer noch nicht, dann benenne die c:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe temporär um (pg_dump.exe.bak) und kopiere die pg_dump_test_x64.exe als pg_dump.exe nach c:\Program Files\PostgreSQL\9.5\bin\.
      Wenn die Test-Exe dann nicht abschmiert, hakt es an einer Stelle, an der ich bestenfalls noch mit Teamviewer weiterhelfen könnte.

    Teste mal alle Buttons durch und melde dich dann wieder...

    PostgreSQL_DUMP.au3
    AutoIt
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Compile_Both=y
    #AutoIt3Wrapper_UseX64=y
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    
    #Region    ;************ Includes ************
    #include <Array.au3>
    #Include <EditConstants.au3>
    #Include <GUIConstantsEx.au3>
    #include <Date.au3>
    #include <File.au3>
    #include <WinAPIMisc.au3>
    #EndRegion ;************ Includes ************
    
    
    ;-- TIME_STAMP   2016-08-09 23:09:22
    
    
    Opt('MustDeclareVars', 1)
    
    
    #Region - ;************ GUI Create **********
    GUICreate('Backup', 1280, 360)
    Local $idButton_DirC      = GUICtrlCreateButton('Inhalt von Laufwerk C: anzeigen',		 10, 320, 180, 32)
    Local $idButton_BackupCMD = GUICtrlCreateButton('Backup via CMD starten',				190, 320, 150, 32)
    Local $idButton_BackupEXE = GUICtrlCreateButton('Backup via EXE starten',				340, 320, 150, 32)
    Local $idButton_VLC       = GUICtrlCreateButton('Video(s) mit VLC-Player abspielen',	490, 320, 180, 32)
    Local $idButton_Exit      = GUICtrlCreateButton('Programm beenden',						1050, 320, 220, 32)
    Local $idEdit_Log         = GUICtrlCreateEdit('', 10, 10, 1260, 300, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
    GUISetState()
    
    
    _WriteLog('Backup Programm Start: ', _NowDate() & ' - ' & _NowTime())
    
    
    #EndRegion ;************ GUI Create **********
    
    
    #Region - ;************ GUI SelectLoop ******
    While 1
    	Switch GUIGetMsg()
    		Case $GUI_EVENT_CLOSE, $idButton_Exit
    			Exit
    		Case $idButton_DirC
    			_DirC()
    		Case $idButton_BackupCMD
    			_BackupCMD()
    		Case $idButton_BackupEXE
    			_BackupEXE()
    		Case $idButton_VLC
    			_VLC()
    	EndSwitch
    WEnd
    #EndRegion ;************ GUI SelectLoop ******
    
    
    Exit
    
    
    Func _DirC()
    	_WriteLog('Inhalt von Laufwerk ', 'C: anzeigen...')
    	Local $iPID = Run(@ComSpec & " /c " & "Dir C:", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    	_WriteOutputToLog($iPID)
    EndFunc
    
    
    Func _BackupCMD()
    	; Passwort in Umgebungsvariable für PostgreSQL setzen - Paswort evtl. korrigieren
    	EnvSet('PGPASSWORD', '12345')
    	EnvUpdate()
    	Local $sPG_DUMP  = "C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe"
    	Local $sFileName = "c:\asv\sicherung\asv_" & StringReplace(_NowCalcDate(), '/', '_') & ".backup"
    	Local $sPARAMETER = '--host localhost --port 5432 --username postgres --no-password --format custom --blobs --verbose --file'
    	Local $sCMD = StringFormat('%s %s %s"%s" %s "%s" %s%s', @ComSpec, "/c", '"', $sPG_DUMP, $sPARAMETER, $sFileName, 'asv', '"')
    	_WriteLog('Backup Befehl via CMD: ', $sCMD)
    	;Return
    	If FileExists($sPG_DUMP) = 0 Then
    		_WriteLog('Fatal Error: ', 'Das Program ' & $sPG_DUMP & ' konnte nicht gefunden werden!')
    		Return SetError(1, 0, $sPG_DUMP)
    	EndIf
    	;Return
    
    
    	Local $iPID = Run($sCMD, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    	_WriteLog('PG_DUMP.EXE wurde gestartet -  ', '$iPID = ' & $iPID)
    	_WriteOutputToLog($iPID)
    
    
    	; Umgebungsvariable für PostgreSQL wieder löschen
    	EnvSet('PGPASSWORD')
    EndFunc
    
    
    Func _BackupEXE()
    	; Passwort in Umgebungsvariable für PostgreSQL setzen - Paswort evtl. korrigieren
    	EnvSet('PGPASSWORD', '12345')
    	EnvUpdate()
    	Local $sPG_DUMP  = "C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe"
    	Local $sFileName = "c:\asv\sicherung\asv_" & StringReplace(_NowCalcDate(), '/', '_') & ".backup"
    	Local $sPARAMETER = '--host localhost --port 5432 --username postgres --no-password --format custom --blobs --verbose --file'
    	Local $sCMD = StringFormat('"%s" %s "%s" %s', $sPG_DUMP, $sPARAMETER, $sFileName, 'asv')
    	_WriteLog('Backup Befehl via EXE: ', $sCMD)
    	;Return
    	If FileExists($sPG_DUMP) = 0 Then
    		_WriteLog('Fatal Error: ', 'Das Program ' & $sPG_DUMP & ' konnte nicht gefunden werden!')
    		Return SetError(1, 0, $sPG_DUMP)
    	EndIf
    	;Return
    
    
    	Local $iPID = Run($sCMD, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    	_WriteLog('PG_DUMP.EXE wurde gestartet -  ', '$iPID = ' & $iPID)
    	_WriteOutputToLog($iPID)
    
    
    	; Umgebungsvariable für PostgreSQL wieder löschen
    	EnvSet('PGPASSWORD')
    EndFunc
    
    
    Func _VLC()
    	; Video-Datei(en) (auch in ISO/ZIP/RAR/7z gepackte) mit VLC abspielen
    	Local $sVLC = "C:\Program Files\VideoLAN\VLC\vlc.exe"
    
    
    	If FileExists($sVLC) = 0 Then
    		_WriteLog('Fatal Error: ', 'Das Program ' & $sVLC & ' konnte nicht gefunden werden!')
    		Return SetError(1, 0, $sVLC)
    	EndIf
    
    
    	; Look for video files
    	Local $sVideoExt =  'Videos (*.mpv;*.mpg;*.mpeg;*.mov;*.divx;*.wmv;*.vob;*.img;*.flv;*.qt;*.ram;*.ras;*.rm;*.rmvb;*.rp;*.rpl;*.rt;*.asf;*.swf;*.rmvb;*.ts;*.m1v;*.m2v;*.fbr;*.webm;*.3gp;*part01.rar;*.rar;*.mkv;*.avi;*.mp4;*.img;*.iso;*.IFO)'
        Local $sVideoFiles = FileOpenDialog('Video-Dateien auswählen', @DesktopDir, $sVideoExt, $FD_FILEMUSTEXIST + $FD_PATHMUSTEXIST + $FD_MULTISELECT)
        If @error Then
            MsgBox($MB_SYSTEMMODAL, "Ooops!", "No video files found/selected")
    		Return SetError(1, '', "No video files found/selected")
        EndIf
    
    
    	; Wurde mehrere Video-Dateien ausgewählt?
    	If StringInStr($sVideoFiles, '|') Then
    		ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & "   var: $sVideoFiles --> " & $sVideoFiles & @LF)
    		Local $aArray = StringSplit($sVideoFiles, '|')
    	Else
    		ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & "   var: $sVideoFiles --> " & $sVideoFiles & @LF)
    		Local $aArray[3] = [1]
    		Local $iPos = StringInStr($sVideoFiles, '\', 0, -1)
    		$aArray[1] = StringMid($sVideoFiles, 1, $iPos -1)	; Pfadname
    		$aArray[2] = StringMid($sVideoFiles, $iPos +1)		; Video-Datei
    	EndIf
    	;_ArrayDisplay($aArray, '$aArray')
    	;Exit
    
    
    	; $aArray[0] = Counter, $aArray[1] = Pfadname, $aArray[2] - $aArray[n] = Video-Dateien
    	Local $sFileName = ''
    	For $i = 2 To UBound($aArray) -1 Step 1
    		$sFileName = $aArray[1] & '\' & $aArray[$i]
    		Local $sCMD = StringFormat('%s %s %s"%s" %s "%s"%s', @ComSpec, "/c", '"', $sVLC, "-Idummy --play-and-exit --fullscreen --no-sub-autodetect-file", $sFileName, '"')
    		_WriteLog('VLC palying now: ', $sFileName)
    		Local $iPID = Run($sCMD, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    		_WriteLog('VLC-Player wurde gestartet -  ', '$iPID = ' & $iPID)
    		_WriteOutputToLog($iPID)
    	Next
    EndFunc
    
    
    Func _WriteOutputToLog($iPID)
        Local $sOutput = ""
        While 1
            $sOutput = StdoutRead($iPID)
            If @error Then ; Exit the loop if the process closes or StdoutRead returns an error.
                ExitLoop
            EndIf
    		_WriteLog('Stdout Read: ', $sOutput)
        WEnd
    
    
        While 1
            $sOutput = StderrRead($iPID)
            If @error Then ; Exit the loop if the process closes or StderrRead returns an error.
                ExitLoop
            EndIf
    		_WriteLog('Stderr Read: ', $sOutput)
        WEnd
    EndFunc
    
    
    Func _WriteLog($sPrefix, $sText)
    	If $sText = '' Then Return
    	Local $aASCII = ['ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß']
    	For $i = 0 To UBound($aASCII) -1
    		If StringInStr($sText, $aASCII[$i]) Then
    			GUICtrlSetData($idEdit_Log, $sPrefix & $sText & @CRLF, 1)
    			Return
    		EndIf
    	Next
    	GUICtrlSetData($idEdit_Log, $sPrefix & _WinAPI_OemToChar($sText) & @CRLF, 1)
    EndFunc
    Alles anzeigen
    pg_dump_test.au3 (Test-Script)
    AutoIt
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Compile_Both=y
    #AutoIt3Wrapper_UseX64=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ;-- TIME_STAMP   2016-08-09 22:50:05
    
    
    ; PostgreSQL\9.5\bin\pg_dump.exe
    
    
    Local $sBefehl = ''
    For $i = 1 To UBound($CMDLINE) -1 Step 1
    	$sBefehl &= $CMDLINE[$i] & @CRLF
    Next
    MsgBox(0, 'pg_dump.exe', $sBefehl)
    ConsoleWrite($sBefehl & @CRLF)
    Alles anzeigen


    PostgreSQL.png

  • RunWait

    • Bitnugger
    • 7. August 2016 um 22:37

    Hier stürzt nicht das Script ab, sondern AutoIt... welches Script (poste es mal hier, wenn es von mir war und du daran etwas geändert hast) hast du denn wie in AutoIt gestartet? Hast du es einfach mit F5 ausgeführt, oder die kompilierte Exe gestartet? Welche Version von AutoIt hast du installiert? Welches Betriebssystem hast du, welche Version? Startest du das Script als 64-bit, oder32-bit?

    $idEdit_Log - wo ist denn diese Variable definiert und wie oder wo werden die Daten übergeben bzw. gespeichert?

  • RunWait

    • Bitnugger
    • 7. August 2016 um 02:07
    Zitat von stefanwue

    Local $sPG_DUMP = "C:\Programme\PostgreSQL\9.5\bin\pg_dump.exe"

    "Programme" ist lediglich ist ein Hardlink, der auf "Program Files" verweist... so hast du natürlich keine Leerzeichen im Pfad und musst es daher auch nicht doppelt in Quote packen. Allerdings besteht hierbei die Gefahr, dass dein Script auf anderssprachigen Systemen ins Leere läuft, da es dort kein "Programme" gibt! Ich schaue mir das noch mal in aller Ruhe an und teste es mal anhand einiger Befehle, die ich hier verfügbar habe. Doch jetzt muss ich erst mal mein Windows neu aufsetzen, das mir mein Feund zerschossen hat... melde mich dann morgen im Laufe des Tages.

    Zitat von stefanwue

    dann macht er das Backup aber er schreibt nichts in $idEdit_Log als Ausgabe und das Programm stürzt mit einer Fehlermeldung ab.

    $idEdit_Log??? - und welche Fehlermeldung es war, soll mir dann wohl meine Glaskugel sagen, oder wie? ;)

  • RunWait

    • Bitnugger
    • 6. August 2016 um 22:32

    Oh backe, das ist ja mal ein saudummer Fehler von mir... :cursing:

    AutoIt
    Local $sPG_DUMP  = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe"'
    	Local $sFileName = "c:\asv\sicherung\asv_" & StringReplace(_NowCalcDate(), '/', '_') & ".backup"
    	Local $sCMD = $sPG_DUMP & ' --host localhost --port 5432 --username postgres --no-password --format custom --blobs --verbose --file "' & $sFileName & '" asv'
    	_WriteLog('Backup Befehl: ', $sCMD)
    	If FileExists($sPG_DUMP) = 0 Then
    		_WriteLog('Fatal Error: ', 'Das Program ' & $sPG_DUMP & 'konnte nicht gefunden werden!')
    		Return SetError(1, 0, $sPG_DUMP)
    	EndIf


    Zeile 53: Local $sPG_DUMP = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" '

    Dass der Befehl nicht gefunden wird, liegt sicher an dem Leerzeichen am Ende der Zeile --> .exe" '

    Ich habe die Zeilen 53 und 55 im Script aus Post #7 nun korrigiert... jetzt sollte es aber funktionieren!

  • RunWait

    • Bitnugger
    • 6. August 2016 um 13:11

    PostgreSQL_ERR_Backup.png

    Die obige grün markierte Ausgabe habe ich mit diesem Script hier bekommen... die $iPID darf nicht 0 sein... versuche es noch mal mit diesem Script - und auch mal den "Inhalt von Laufwerk C: anzeigen" anklicken!

    Spoiler anzeigen
    AutoIt
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    
    #Region    ;************ Includes ************
    #Include <EditConstants.au3>
    #Include <GUIConstantsEx.au3>
    #include <Date.au3>
    #include <WinAPIMisc.au3>
    #EndRegion ;************ Includes ************
    
    
    ;-- TIME_STAMP   2016-08-06 12:43:28
    
    
    Opt('MustDeclareVars', 1)
    
    
    #Region - ;************ GUI Create **********
    GUICreate('Backup', 1280, 360)
    Local $idButton_DirC   = GUICtrlCreateButton('Inhalt von Laufwerk C: anzeigen', 10, 320, 420, 32)
    Local $idButton_Backup = GUICtrlCreateButton('Backup starten', 430, 320, 420, 32)
    Local $idButton_Exit   = GUICtrlCreateButton('Programm beenden',850, 320, 420, 32)
    Local $idEdit_Log      = GUICtrlCreateEdit('', 10, 10, 1260, 300, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
    GUISetState()
    
    
    _WriteLog('Backup Programm Start: ', _NowDate() & ' - ' & _NowTime())
    
    
    #EndRegion ;************ GUI Create **********
    
    
    #Region - ;************ GUI SelectLoop ******
    While 1
    	Switch GUIGetMsg()
    		Case $GUI_EVENT_CLOSE, $idButton_Exit
    			Exit
    		Case $idButton_DirC
    			_DirC()
    		Case $idButton_Backup
    			_Backup()
    	EndSwitch
    WEnd
    #EndRegion ;************ GUI SelectLoop ******
    
    
    Exit
    
    
    Func _DirC()
    	_WriteLog('Inhalt von Laufwerk ', 'C: anzeigen...')
    	Local $iPID = Run(@ComSpec & " /c " & "Dir C:", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    	_WriteOutputToLog($iPID)
    EndFunc
    
    
    Func _Backup()
    	; Passwort in Umgebungsvariable für PostgreSQL setzen - Paswort evtl. korrigieren
    	EnvSet('PGPASSWORD', '12345')
    	; EnvUpdate()	; hier mal auskommentieren, wenn Fehler...
    	Local $sPG_DUMP  = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" '
    	Local $sFileName = "c:\asv\sicherung\asv_" & StringReplace(_NowCalcDate(), '/', '_') & ".backup"
    	Local $sCMD = $sPG_DUMP & '--host localhost --port 5432 --username postgres --no-password --format custom --blobs --verbose --file "' & $sFileName & '" asv'
    	_WriteLog('Backup Befehl: ', $sCMD)
    
    
    	If FileExists($sPG_DUMP) = 0 Then
    		_WriteLog('Fatal Error: ', 'Das Program ' & $sPG_DUMP & 'konnte nicht gefunden werden!')
    		Return SetError(1, 0, $sPG_DUMP)
    	EndIf
    
    
    	Local $iPID = Run($sCMD, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    	_WriteLog('PG_DUMP.EXE wurde gestartet -  ', '$iPID = ' & $iPID)
    	_WriteOutputToLog($iPID)
    
    
    	; Passwort für PostgreSQL wieder löschen
    	EnvSet('PGPASSWORD')
    EndFunc
    
    
    Func _WriteOutputToLog($iPID)
        Local $sOutput = ""
        While 1
            $sOutput = StdoutRead($iPID)
            If @error Then ; Exit the loop if the process closes or StdoutRead returns an error.
                ExitLoop
            EndIf
    		_WriteLog('Stdout Read: ', $sOutput)
        WEnd
    
    
        While 1
            $sOutput = StderrRead($iPID)
            If @error Then ; Exit the loop if the process closes or StderrRead returns an error.
                ExitLoop
            EndIf
    		_WriteLog('Stderr Read: ', $sOutput)
        WEnd
    EndFunc
    
    
    Func _WriteLog($sPrefix, $sText)
    	If $sText = '' Then Return
    	GUICtrlSetData($idEdit_Log, $sPrefix & _WinAPI_OemToChar($sText) & @CRLF, 1)
    EndFunc
    Alles anzeigen
  • ADF-Datei (Floppydisk-Rip) auslesen und Inhalt abspeichern...

    • Bitnugger
    • 6. August 2016 um 09:46

    Hast du dir denn den 2. Link von mir mal genauer angeschaut?

    With this useful tools:
    ADFlib (C) 1997-1998 by Laurent Clevy & Dan Sutherland
    http://lclevy.free.fr/adflib


    Zlib by Jean-loup Gailly & Mark Adler
    http://www.zlib.org


    and
    xDMS by Andre Rodrigues de la Rocha


    http://lclevy.free.fr/adflib/adf_info.html

  • ADF-Datei (Floppydisk-Rip) auslesen und Inhalt abspeichern...

    • Bitnugger
    • 6. August 2016 um 09:25

    Der Total Commander kann diese Dateien mit einem zusätzlichen Plugin entpacken/erzeugen/ändern: AmigaDX und/oder Hier

    Na ja, und den TC kann man zudem auch sehr gut mit AutoIt fernsteuern...

    TC_ADF.png

  • RunWait

    • Bitnugger
    • 6. August 2016 um 02:14
    Zitat von stefanwue

    Local $pass = 'set PGPASSWORD=' & $password
    ConsoleWrite($pass & @CRLF)

    Das macht null Sinn, weil du bei RunWait() den Parameter --no-password angibst - der pg_dump.exe wird also gesagt, dass KEIN Passwort benötigt wird...

    Ich denke der korrekte Parameter in diesem Fall wäre...

    Local $pass = 12345
    ...pg_dump.exe --password $pass ...

    Und Runwait() macht auch keinen Sinn... wir wollen ja nicht warten, bis der Befehl fertig ist und sich beendet hat, sondern wir wollen die Ausgabe des Befehls quasi "LIVE" mitschneiden.

    Wenn ich nicht total panne bin, hast du wegen dieser Frage noch einen Tread laufen, in dem ich dir geantwortet habe... hier das Script in leicht abgeänderter Form, wobei hier das 'asv' als zusätzlicher Parameter hinter dem Dateinamen angehangen wird. Teste das Script mal und zeige uns, was du dann als Ausgabe angezeigt bekommst, wenn es NICHT funktioniert.

    Spoiler anzeigen
    AutoIt
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    
    #Region    ;************ Includes ************
    #Include <EditConstants.au3>
    #Include <GUIConstantsEx.au3>
    #include <Date.au3>
    #include <WinAPIMisc.au3>
    #EndRegion ;************ Includes ************
    
    
    ;-- TIME_STAMP   2016-08-06 02:45:59
    
    
    Opt('MustDeclareVars', 1)
    
    
    #Region - ;************ GUI Create **********
    GUICreate('Backup', 1280, 360)
    Local $idButton_DirC   = GUICtrlCreateButton('Inhalt von Laufwerk C: anzeigen', 10, 320, 420, 32)
    Local $idButton_Backup = GUICtrlCreateButton('Backup starten', 430, 320, 420, 32)
    Local $idButton_Exit   = GUICtrlCreateButton('Programm beenden',850, 320, 420, 32)
    Local $idEdit_Log      = GUICtrlCreateEdit('', 10, 10, 1260, 300, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
    GUISetState()
    
    
    _WriteLog('Backup Programm Start: ', _NowDate() & ' - ' & _NowTime())
    
    
    #EndRegion ;************ GUI Create **********
    
    
    #Region - ;************ GUI SelectLoop ******
    While 1
    	Switch GUIGetMsg()
    		Case $GUI_EVENT_CLOSE, $idButton_Exit
    			Exit
    		Case $idButton_DirC
    			_DirC()
    		Case $idButton_Backup
    			_Backup()
    	EndSwitch
    WEnd
    #EndRegion ;************ GUI SelectLoop ******
    
    
    Exit
    
    
    Func _DirC()
    	_WriteLog('Inhalt von Laufwerk ', 'C: anzeigen...')
    	Local $iPID = Run(@ComSpec & " /c " & "Dir C:", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    	_WriteOutputToLog($iPID)
    EndFunc
    
    
    Func _Backup()
    	; Passwort in Umgebungsvariable für PostgreSQL setzen - Paswort evtl. korrigieren
    	EnvSet('PGPASSWORD', '12345')
    	; EnvUpdate()	; hier mal auskommentieren, wenn Fehler...
    	Local $sPG_DUMP  = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe"'
    	Local $sFileName = "c:\asv\sicherung\asv_" & StringReplace(_NowCalcDate(), '/', '_') & ".backup"
    	Local $sCMD = $sPG_DUMP & ' --host localhost --port 5432 --username postgres --no-password --format custom --blobs --verbose --file "' & $sFileName & '" asv'
    	_WriteLog('Backup Befehl: ', $sCMD)
    
    
    	If FileExists($sPG_DUMP) = 0 Then
    		_WriteLog('Fatal Error: ', 'Das Program ' & $sPG_DUMP & 'konnte nicht gefunden werden!')
    		Return SetError(1, 0, $sPG_DUMP)
    	EndIf
    
    
    	Local $iPID = Run($sCMD, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    	_WriteLog('PG_DUMP.EXE wurde gestartet -  ', '$iPID = ' & $iPID)
    	_WriteOutputToLog($iPID)
    
    
    	; Passwort für PostgreSQL wieder löschen
    	EnvSet('PGPASSWORD')
    EndFunc
    
    
    Func _WriteOutputToLog($iPID)
        Local $sOutput = ""
        While 1
            $sOutput = StdoutRead($iPID)
            If @error Then ; Exit the loop if the process closes or StdoutRead returns an error.
                ExitLoop
            EndIf
    		_WriteLog('Stdout Read: ', $sOutput)
        WEnd
    
    
        While 1
            $sOutput = StderrRead($iPID)
            If @error Then ; Exit the loop if the process closes or StderrRead returns an error.
                ExitLoop
            EndIf
    		_WriteLog('Stderr Read: ', $sOutput)
        WEnd
    EndFunc
    
    
    Func _WriteLog($sPrefix, $sText)
    	If $sText = '' Then Return
    	GUICtrlSetData($idEdit_Log, $sPrefix & _WinAPI_OemToChar($sText) & @CRLF, 1)
    EndFunc
    Alles anzeigen

    Nachtrag: Hier steht es... falls ein Passwort gesetzt und verwendet werden soll, wird es in der Datei .pgpass erwartet.

    -w
    --no-password Never issue a password prompt. If the server requires password authentication and a password is not available by other means such as a .pgpass file, the connection attempt will fail. This option can be useful in batch jobs and scripts where no user is present to enter a password.
    -W
    --password Force pg_dump to prompt for a password before connecting to a database.
    This option is never essential, since pg_dump will automatically prompt for a password if the server demands password authentication. However, pg_dump will waste a connection attempt finding out that the server wants a password. In some cases it is worth typing -W to avoid the extra connection attempt.


    Wie diese Datei aufgebaut sein muss, wird hier beschrieben: https://www.postgresql.org/docs/9.3/static/libpq-pgpass.html

    In dem Fall ist der Parameter --no-password dann doch korrekt - doch das Passwort, wenn eines benötigt wird, muss dann in der Datei .pgpass stehen.

    Alternativ, so wie du es angedacht hattest, via Umbebungsvariable...

    31.13. Environment Variables

    PGPASSWORD behaves the same as the password connection parameter. Use of this environment variable is not recommended for security reasons, as some operating systems allow non-root users to see process environment variables via ps; instead consider using the ~/.pgpass file (see Section 31.14).

    Habe das Script nun entsprechend angepasst...


    Im Anhang auch noch mal eine geänderte Version deiner Batch mit ein paar Kommentaren dazu...

    Dateien

    Sicherung.rar 852 Byte – 262 Downloads
  • Run() geht nicht mehr o.o

    • Bitnugger
    • 5. August 2016 um 15:52

    Die Umgebungsvariable %PATHEXT% gibt Auskunft darüber, ob eine Datei ausgeführt werden kann. Wird die Dateiendung ".xyz" hier nicht aufgeführt, kann die Datei nicht ausgeführt werden - was bei unbekannten Dateiendungen ja immer der Fall ist!

    Bash
    :~# echo %PATHEXT%
    .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW
    Zitat von xSunLighTx3

    Local $pid = Run('"' & @ScriptDir & '\w.txt"')


    Schickst du diesen "Befehl" direkt in der Eingabeaufforderung ab, wird die Datei "w.txt" im Texteditor geöffnet.

    Gleiches Verhalten kannst du in AutoIt so reproduzieren...

    AutoIt
    Local $pid = Run(@ComSpec & ' /c "' & @ScriptDir & '\w.txt"')


    Die Run() Funktion in AutoIt liefert uns jedoch lediglich einen Fehlercode, was vermuten lässt, dass vorab überprüft wird, ob die Dateiendung ".txt" in der Variable %PATHEXT% enthalten ist - sprich: welche(s|r) Programm/Interpreter damit gefüttert werden soll.

    Allerdings ist es für meine Begriffe nicht sonderlich klug, Dateien mit unbekannten Dateiendungen ausführen zu wollen... denn das kann u.U. sehr böse enden!

    Ich habe dir aber dennoch ein kleines Script gebastelt, mit dem dies möglich ist...

    Run_Unknown_Ext.au3
    AutoIt
    ;-- TIME_STAMP   2016-08-05 15:45:00
    
    
    #RequireAdmin
    
    
    #Region    ;************ Includes ************
    #include <WinAPIReg.au3>
    #include <File.au3>
    #EndRegion ;************ Includes ************
    
    
    ; Hier den Pfad anpassen...
    Local $sPath = "C:\Users\dev acc\Desktop\run test"
    
    
    If FileExists($sPath) = 0 Then DirCreate($sPath)
    If FileExists($sPath & '\x.cmd') = 0 Then FileWrite($sPath & '\x.cmd', 'mspaint.exe')
    If FileExists($sPath & '\x.txt') = 0 Then FileWrite($sPath & '\x.txt', 'notepad.exe')
    If FileExists($sPath & '\x.xyz') = 0 Then FileWrite($sPath & '\x.xyz', 'C:\Windows\System32\win32calc.exe')
    
    
    _ShowAssoc('.xyz')
    _ShowAssoc('.cmd')
    _ShowAssoc('.txt')
    ;_ShowAssoc('.au3')
    ;_ShowAssoc('.exe')
    
    
    _Run_xyz($sPath & '\x.cmd')
    _Run_xyz($sPath & '\x.txt')
    _Run_xyz($sPath & '\x.xyz')
    
    
    Func _ShowAssoc($sExt)
    	ConsoleWrite('------------------------------------------------------------' & @CRLF)
    	ConsoleWrite('Extension....: ' & $sExt & @CRLF)
    	ConsoleWrite('Type.........: ' & _WinAPI_AssocQueryString($sExt, $ASSOCSTR_FRIENDLYDOCNAME) & @CRLF)
    	ConsoleWrite('Command......: ' & _WinAPI_AssocQueryString($sExt, $ASSOCSTR_COMMAND) & @CRLF)
    	ConsoleWrite('Executable...: ' & _WinAPI_AssocQueryString($sExt, $ASSOCSTR_EXECUTABLE) & @CRLF)
    	ConsoleWrite('Icon.........: ' & _WinAPI_AssocQueryString($sExt, $ASSOCSTR_DEFAULTICON) & @CRLF)
    	ConsoleWrite('+-----------------------------------------------------------' & @CRLF & @CRLF)
    EndFunc
    
    
    Func _Run_xyz($sCommand)
    	ConsoleWrite('------------------------------------------------------------' & @CRLF)
    	Local $sTempFile = ''
    	Local $sDrive = "", $sDir = "", $sFileName = "", $sExtension = ""
    	Local $aPathSplit = _PathSplit($sCommand, $sDrive, $sDir, $sFileName, $sExtension)
    	Local $sPath = $sDrive & $sDir
    
    
    	Local $sPATHEXT = EnvGet('PATHEXT')
    	If StringInStr($sPATHEXT, $sExtension) = 0 Then
    
    
    		If StringInStr(_WinAPI_AssocQueryString($sExtension, $ASSOCSTR_COMMAND), 'OpenWith.exe') Then
    			$iError = 1
    			$sMessage = '! Achtung - "' & $sFileName & $sExtension & '" ist eine Datei mit einer unbekannten Extension!' & @CRLF
    			ConsoleWrite($sMessage)
    		Else
    			$iError = 2
    			$sMessage = '! Achtung - "' & $sFileName & $sExtension & '" ist keine ausführbare Datei!' & @CRLF
    			ConsoleWrite($sMessage)
    		EndIf
    
    
    		Local $iMsgBoxAnswer = MsgBox(262196, 'Achtung!', $sMessage & @CRLF & @CRLF & "Willst du versuchen die Datei als BatchFile auszuführen?")
    		Select
    			Case $iMsgBoxAnswer = 6 ;Yes
    				ConsoleWrite('- Ok, dann versuchen wir die Datei als BatchFile auszuführen...' & @CRLF)
    			Case $iMsgBoxAnswer = 7 ;No
    				ConsoleWrite('+ No, das ist eine intelligente Entscheidung! ;-)' & @CRLF)
    				Return SetError($iError, 0, $sMessage)
    		EndSelect
    
    
    		; Generate a unique filename in @TempDir
    		$sTempFile = StringReplace(_TempFile(), '.tmp', '.cmd')
    		FileCopy($sCommand, $sTempFile)
    		$aPathSplit = _PathSplit($sTempFile, $sDrive, $sDir, $sFileName, $sExtension)
    		$sCommand = $sTempFile
    		$sPath = $sDrive & $sDir
    	EndIf
    	Local $sCMD = @ComSpec & ' /c "' & $sCommand & '"'
    	ConsoleWrite('$sPath = ' & $sDrive & $sDir & @CRLF)
    	ConsoleWrite('$sCMD  = ' & $sCMD & @CRLF)
    	ConsoleWrite('+-----------------------------------------------------------' & @CRLF & @CRLF)
    	Local $iPID = Run($sCMD, $sPath, @SW_HIDE)
    	Local $iError = @error
    	While ProcessExists($iPID)
    		Sleep(100)
    	WEnd
    	If $sTempFile <> '' Then FileDelete($sTempFile)
    	If $iError <> 0 Then Exit MsgBox(0, '#Error', "Run() lieferte den Fehlercode: " & $iError) +2
    EndFunc
    Alles anzeigen
  • Varibabeln mit Knopfdruck addieren

    • Bitnugger
    • 5. August 2016 um 07:03

    Zuerst einmal solltest du dein Script in Code-Tags packen, wenn du es hier postest! Bei längeren Scripts macht es sich zudem gut, wenn du die Code-Tags in einen Spoiler-Tag packst.

    Wenn du SciTE4AutoIt3 installiert hast, kannst du dein Script mit Ctrl + T (Tidy AutoIt Source) formatieren lassen, damit man kein Augenkrebs bekommt, wenn man sich deinen Code anschaut. :D

    Zitat von LaMagnos

    Muss ich evt. das GUI noch aktualiesieren ?

    aktualiesieren --> aktualisieren

    Nein, nicht das GUI, sondern das Control in dem der aktualisierte Wert angezeigt werden soll - in deinem Fall also das Label $Label1...


    Add_Variable.au3
    AutoIt
    ;-- TIME_STAMP   2016-08-05 07:02:15
    
    
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    
    
    #Region ### START Koda GUI section ### Form=
    Global $g_hGUI = GUICreate("Form1", 235, 165, 192, 124)
    Global $g_iVarbual = 0
    Global $g_Label1 = GUICtrlCreateLabel($g_iVarbual, 72, 24, 36, 17)
    Global $g_Button_Add = GUICtrlCreateButton("Add 1",  10, 80, 100, 65)
    Global $g_Button_Sub = GUICtrlCreateButton("Sub 1", 120, 80, 100, 65)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    
    
    
    
    While 1
    	$nMsg = GUIGetMsg()
    	Switch $nMsg
    		Case $GUI_EVENT_CLOSE
    			Exit
    		Case $g_Button_Add
    			$g_iVarbual += 1
    			GUICtrlSetData($g_Label1, $g_iVarbual)
    		Case $g_Button_Sub
    			$g_iVarbual -= 1
    			GUICtrlSetData($g_Label1, $g_iVarbual)
    	EndSwitch
    WEnd
    Alles anzeigen
  • CMD Befehl ausführen

    • Bitnugger
    • 5. August 2016 um 05:20
    Zitat von stefanwue

    set PGPASSWORD=12345

    Das macht allerdings keinen Sinn, wenn du die pg_dump.exe mit dem Parameter --no-password aufrufst... ich tippe mal darauf, dass hier --password 12345 der richtige Parameter ist.

    Backup starten...
    AutoIt
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    
    #Region    ;************ Includes ************
    #Include <EditConstants.au3>
    #Include <GUIConstantsEx.au3>
    #include <Date.au3>
    #include <WinAPIMisc.au3>
    #EndRegion ;************ Includes ************
    
    
    ;-- TIME_STAMP   2016-08-05 06:25:25
    
    
    Opt('MustDeclareVars', 1)
    
    
    #Region - ;************ GUI Create **********
    GUICreate('Backup', 1280, 360)
    Local $idButton_DirC   = GUICtrlCreateButton('Inhalt von Laufwerk C: anzeigen', 10, 320, 420, 32)
    Local $idButton_Backup = GUICtrlCreateButton('Backup starten', 430, 320, 420, 32)
    Local $idButton_Exit   = GUICtrlCreateButton('Programm beenden',850, 320, 420, 32)
    Local $idEdit_Log      = GUICtrlCreateEdit('', 10, 10, 1260, 300, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
    GUISetState()
    
    
    _WriteLog('Backup Programm Start: ', _NowDate() & ' - ' & _NowTime())
    
    
    #EndRegion ;************ GUI Create **********
    
    
    #Region - ;************ GUI SelectLoop ******
    While 1
    	Switch GUIGetMsg()
    		Case $GUI_EVENT_CLOSE, $idButton_Exit
    			Exit
    		Case $idButton_DirC
    			_DirC()
    		Case $idButton_Backup
    			_Backup()
    	EndSwitch
    WEnd
    #EndRegion ;************ GUI SelectLoop ******
    
    
    Exit
    
    
    Func _DirC()
    	_WriteLog('Inhalt von Laufwerk ', 'C: anzeigen...')
    	Local $iPID = Run(@ComSpec & " /c " & "Dir C:", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    	_WriteOutputToLog($iPID)
    EndFunc
    
    
    Func _Backup()
    	Local $sPassword = 12345
    	Local $sPG_DUMP  = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" '
    	Local $sFileName = "c:\asv\sicherung\asv_" & StringReplace(_NowCalcDate(), '/', '_') & ".backup.asv"
    	Local $sCMD = $sPG_DUMP & '--host localhost --port 5432 --username postgres --password ' & $sPassword & ' --format custom --blobs --verbose --file "' & $sFileName & '"'
    	_WriteLog('Backup Befehl: ', $sCMD)
    
    
    	If FileExists($sPG_DUMP) = 0 Then
    		_WriteLog('Fatal Error: ', 'Das Program ' & $sPG_DUMP & 'konnte nicht gefunden werden!')
    		Return SetError(1, 0, $sPG_DUMP)
    	EndIf
    
    
    	Local $iPID = Run($sCMD, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    	_WriteLog('PG_DUMP.EXE wurde gestartet -  ', '$iPID = ' & $iPID)
    	_WriteOutputToLog($iPID)
    EndFunc
    
    
    Func _WriteOutputToLog($iPID)
        Local $sOutput = ""
        While 1
            $sOutput = StdoutRead($iPID)
            If @error Then ; Exit the loop if the process closes or StdoutRead returns an error.
                ExitLoop
            EndIf
    		_WriteLog('Stdout Read: ', $sOutput)
        WEnd
    
    
        While 1
            $sOutput = StderrRead($iPID)
            If @error Then ; Exit the loop if the process closes or StderrRead returns an error.
                ExitLoop
            EndIf
    		_WriteLog('Stderr Read: ', $sOutput)
        WEnd
    EndFunc
    
    
    Func _WriteLog($sPrefix, $sText)
    	If $sText = '' Then Return
    	GUICtrlSetData($idEdit_Log, $sPrefix & _WinAPI_OemToChar($sText) & @CRLF, 1)
    EndFunc
    Alles anzeigen
  • RunWait

    • Bitnugger
    • 5. August 2016 um 01:49
    AutoIt
    Local $cmd = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" --host localhost --port 5432 --username postgres --no-password --format custom --blobs --verbose --file c:\asv\sicherung\asv_%date:~6,4%_%date:~3,2%_%date:~0,2%.backup asv'
    ConsoleWrite($cmd & @CRLF)
    Local $foo = RunWait($cmd)

    Der letzte Parameter "asv" macht so allerdings keinen Sinn... weil --file hier einen Dateinamen erwartet - und der endet nach .backup.

    Wenn du das "asv" als Dateieindung verwenden willst, sollte die Zeile so aussehen...

    AutoIt
    Local $cmd = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" --host localhost --port 5432 --username postgres --no-password --format custom --blobs --verbose --file c:\asv\sicherung\asv_%date:~6,4%_%date:~3,2%_%date:~0,2%.backup.asv'
    ConsoleWrite($cmd & @CRLF)
    Local $foo = RunWait($cmd)

    Solltes du jedoch den Dateinamen so ".backup asv" enden lassen wollen, muss der komplette Name in Quote gesetzt werden... was allerdings sehr unfein wäre...

    AutoIt
    Local $cmd = '"C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe" --host localhost --port 5432 --username postgres --no-password --format custom --blobs --verbose --file "c:\asv\sicherung\asv_%date:~6,4%_%date:~3,2%_%date:~0,2%.backup asv"'
    ConsoleWrite($cmd & @CRLF)
    Local $foo = RunWait($cmd)
  • Autoit TCP server aus Linux heraus erreichen

    • Bitnugger
    • 3. August 2016 um 16:17

    In Linux kannst du dem Echo-Befehl sagen, dass er kein LF ans Zeilenende anhängen soll.

    -n Keine Ausgabe des am Zeilenende stehenden Zeilentrenners

    $ echo -n 'Dies ist ein Text ohne LF (0A)...'


    Alternativ ginge auch dies...

    $ echo -e 'Dies ist ein Text mit CRLF (0D0A)...\r\n'

  • Tastatur entprellen / Keyboard anti bouncing

    • Bitnugger
    • 3. August 2016 um 15:51

    Das IniFile heißt bis auf die Extension genauso wie das Script - nur eben nicht *.au3|*.exe, sondern *.ini.

    Anti_Key_Bouncing.au3 --> Anti_Key_Bouncing.ini
    Anti_Key_Bouncing.exe --> Anti_Key_Bouncing.ini

  • Tastatur entprellen / Keyboard anti bouncing

    • Bitnugger
    • 3. August 2016 um 15:23

    Ich habe mal ein wenig experimentiert... und auch ein paar Infos als Kommentar eingefügt. :D

    Anti_Key_Bouncing()
    AutoIt
    ;-- TIME_STAMP   2016-08-03 15:15:54
    
    
    #include <Array.au3>
    #include <StructureConstants.au3>
    #include <TrayConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    
    
    Opt("MustDeclareVars", 1)
    Opt("TrayMenuMode", 3)
    
    
    Global $g_fDEBUG = True	; --> Line 126
    
    
    Global $g_hHook, $g_hStub_KeyProc, $g_iPause = 0
    
    
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ; Adjust long delay in keystrokes appearing due to Windows FilterKeys
    ; https://support.microsoft.com/en-us/kb/894040
    
    
    ; Keystroke Messages
    ; https://www-user.tu-chemnitz.de/~heha/petzold/ch06c.htm
    
    
    ; http://www.cherry.de/cid/tastenmodule.htm#
    ; Brown Switch: CHERRY MX1A-GxxA/B | CHERRY MX1A-Gxxx
    ;
    ; http://mechanische-tastatur.de/schalter-switches/
    ; https://www.caseking.de/zowie-celeritas-pro-gaming-keyboard-schwarz-de-layout-gata-286.html
    ; http://www.wasdkeyboards.com/index.php/products/keyboard-parts/cherry-mx-brown-keyswitch-mx1a-g1nn-tactile-bump.html
    ; https://deskthority.net/group-buys-f50/cherry-mx-taking-pre-orders-t2760.html
    ; http://www.mouser.de/Electromechanical/Switches/Pushbutton-Switches/_/N-5g30?Keyword=Cherry+MX&FS=True
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    
    ; The KeyboardDelay property indicates the length of time after a key is pressed and held down before
    ; keystroke repeat messages are sent by the operating system.
    ;
    ; This value is in the range from 0 (approximately 250 millisecond delay) through 3 (approximately 1
    ; second delay). The actual delay associated with each value may vary depending on the hardware.
    Global $g_iDelay = RegRead("HKEY_CURRENT_USER\Control Panel\Keyboard", "KeyboardDelay")
    Switch $g_iDelay
    	Case 0
    		$g_iDelay = 250
    	Case 1
    		$g_iDelay = 500
    	Case 2
    		$g_iDelay = 750
    	Case 3
    		$g_iDelay = 1000
    EndSwitch
    
    
    ; The KeyboardSpeed property indicates the repeat speed setting that determines the length of time
    ; between each keystroke repeat message sent by the operating system.
    ;
    ; This is a value in the range from 0 (approximately 2.5 repetitions per second) through 31
    ; (approximately 30 repetitions per second). The actual repeat rates are hardware-dependent and may
    ; vary from a linear scale by as much as 20%.
    Global $g_iSpeed = RegRead("HKEY_CURRENT_USER\Control Panel\Keyboard", "KeyboardSpeed")
    ConsoleWrite("+ @@ Debug line" & @TAB & @ScriptLineNumber & "   var: $g_iDelay                    --> " & $g_iDelay & @LF)
    ConsoleWrite("+ @@ Debug line" & @TAB & @ScriptLineNumber & "   var: $g_iSpeed                    --> " & $g_iSpeed & @LF)
    
    
    ; Current Settings
    Global $g_iAutoRepeatDelay       = RegRead("HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response", "AutoRepeatDelay")
    Global $g_iAutoRepeatRate        = RegRead("HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response", "AutoRepeatRate")
    Global $g_iDelayBeforeAcceptance = RegRead("HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response", "DelayBeforeAcceptance")
    Global $g_iFlags                 = RegRead("HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response", "Flags")
    ConsoleWrite("! @@ Debug line" & @TAB & @ScriptLineNumber & "   var: $g_iAutoRepeatDelay          --> " & $g_iAutoRepeatDelay & @LF)
    ConsoleWrite("! @@ Debug line" & @TAB & @ScriptLineNumber & "   var: $g_iAutoRepeatRate           --> " & $g_iAutoRepeatRate & @LF)
    ConsoleWrite("! @@ Debug line" & @TAB & @ScriptLineNumber & "   var: $g_iDelayBeforeAcceptance    --> " & $g_iDelayBeforeAcceptance & @LF)
    ConsoleWrite("! @@ Debug line" & @TAB & @ScriptLineNumber & "   var: $g_iFlags                    --> " & $g_iFlags & @LF)
    
    
    ; Default Settings
    Global $g_iDefAutoRepeatDelay       = RegRead("HKEY_USERS\.DEFAULT\Control Panel\Accessibility\Keyboard Response", "AutoRepeatDelay")
    Global $g_iDefAutoRepeatRate        = RegRead("HKEY_USERS\.DEFAULT\Control Panel\Accessibility\Keyboard Response", "AutoRepeatRate")
    Global $g_iDefDelayBeforeAcceptance = RegRead("HKEY_USERS\.DEFAULT\Control Panel\Accessibility\Keyboard Response", "DelayBeforeAcceptance")
    Global $g_iDefFlags                 = RegRead("HKEY_USERS\.DEFAULT\Control Panel\Accessibility\Keyboard Response", "Flags")
    ConsoleWrite("- @@ Debug line" & @TAB & @ScriptLineNumber & "   var: $g_iDefAutoRepeatDelay       --> " & $g_iDefAutoRepeatDelay & @LF)
    ConsoleWrite("- @@ Debug line" & @TAB & @ScriptLineNumber & "   var: $g_iDefAutoRepeatRate        --> " & $g_iDefAutoRepeatRate & @LF)
    ConsoleWrite("- @@ Debug line" & @TAB & @ScriptLineNumber & "   var: $g_iDefDelayBeforeAcceptance --> " & $g_iDefDelayBeforeAcceptance & @LF)
    ConsoleWrite("- @@ Debug line" & @TAB & @ScriptLineNumber & "   var: $g_iDefFlags                 --> " & $g_iDefFlags & @LF)
    
    
    Global $sIniFile = StringTrimRight(@ScriptFullPath, 3) & "ini"
    If Not FileExists($sIniFile) Then Exit MsgBox(262160, @ScriptName, 'Kein IniFile gefunden!') + 1
    
    
    Global $g_sKeys  = IniRead($sIniFile, "Used_Chars", "Chars", "")
    Global $g_sAuto  = IniRead($sIniFile, "Autostart", "Enable", "no")
    
    
    If $g_sKeys = '' Then Exit 0	; Dann gibt es hier nichts zu tun...
    
    
    Global $g_aKeys[StringLen($g_sKeys)][2]
    For $i = 1 To UBound($g_aKeys) Step 1
    	$g_aKeys[$i -1][0] = Asc(StringMid(StringUpper($g_sKeys),$i,1))
    	$g_aKeys[$i -1][1] = 0	; Timer
    Next
    
    
    _Main()
    
    
    Func _Main()
    	OnAutoItExitRegister("_Cleanup")
    
    
    	Local $idExit = TrayCreateItem("Exit")
    
    
    	If $g_sAuto = "yes" Then
    		RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Anti_Key_Bouncing", "REG_SZ", @ScriptFullPath)
    	Else
    		RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Anti_Key_Bouncing")
    	EndIf
    
    
    	$g_hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
    	$g_hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($g_hStub_KeyProc), _WinAPI_GetModuleHandle(0))
    
    
    	Do
    	Until TrayGetMsg() = $idExit
    EndFunc  ;==>_Main
    
    
    ; callback function
    Func _KeyProc($nCode, $wParam, $lParam)
    	Local $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    	Local $iKey = DllStructGetData($tKEYHOOKS, "vkCode")
    
    
    	For $i = 0 To UBound($g_aKeys) -1 Step 1
    		If $iKey = $g_aKeys[$i][0] Then
    			Switch $wParam
    				Case $WM_KEYDOWN
    					Select
    						Case $g_aKeys[$i][1] = 0
    							$g_aKeys[$i][1] = TimerInit()
    							If $g_fDEBUG = True Then Beep(500, 50)
    						Case TimerDiff($g_aKeys[$i][1]) < $g_iDelay
    							Return 0
    						Case Else
    							$g_aKeys[$i][1] = -1
    					EndSelect
    				Case $WM_KEYUP
    					$g_aKeys[$i][1] = 0
    			EndSwitch
    		EndIf
    	Next
    
    
    	Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)
    EndFunc  ;==>_KeyProc
    
    
    Func _Cleanup()
    	_WinAPI_UnhookWindowsHookEx($g_hHook)
    	DllCallbackFree($g_hStub_KeyProc)
    EndFunc  ;==>_Cleanup
    Alles anzeigen
  • Tastatur entprellen / Keyboard anti bouncing

    • Bitnugger
    • 3. August 2016 um 01:40

    Ich gebe dann auch mal meinen Senf hinzu...

    Zeile 23/25 - sind überflüssig...
    $g_hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($g_hStub_KeyProc), _WinAPI_GetModuleHandle(0))


    Zeile 28/30 - bei nur einem Befehl kann man das in einer Zeile machen...
    If $pause = 0 Then HotKeySet("{" & $BlockedHotkey & "}")


    Zeile 31-34 - das geht auch mit nur einer Zeile...
    If TrayGetMsg() = $idExit Then ExitLoop


    Zeile 35 - die wichtigste Zeile im Script... grins


    Zeile 40 - ist überflüssig... bzw. das abschließende 'a' muss weg, wobei man diese Zuweisung auch wieder mit nur einer Zeile erledigen kann.
    Local $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)


    Zeile 41 - wäre nach Zeile 44 besser aufgehoben... wobei man Zeile 42-44 auch wieder mit nur einer Zeile erledigen kann.
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)


    Zeile 45/46 - warum fragst du nach $WM_KEYDOWN, wenn es dich nicht interessiert?
    If $wParam = $WM_KEYUP Then ; und das Else ist somit überflüssig...


    Zeile 47 - $iFlags wird nirgends verwendet - die Zeile ist ergo überflüssig...


    Zeile 48/50/51 - Hust... bei jedem Durchlauf werden die Werte erneut umgewandelt - sehr unfein!
    Nach dem Einlesen aus der Ini einmalig konvertieren und in ein Array speichern...


    Zeile 59 - Handelt es sich um eine zu blockende Taste, würde ich das erste Event weiterleiten und alle folgenden unterschlagen, bis die Delaytime ( Timer() ) abgelaufen ist.
    Ein HotKeySet() wäre damit überflüssig. Zudem überprüfst du nicht einmal, ob das HotKey gesetzt werden konnte...

  • Problem mit MouseClick()

    • Bitnugger
    • 27. Juli 2016 um 19:59

    Ja, dass hätte ich noch erwähnen sollen...

  • Senden von Text in Windows Explorer-Leiste mit anschließendem ENTER

    • Bitnugger
    • 25. Juli 2016 um 22:36
    Zitat von auTomate

    ""WinWaitActive[CLASS:DirectUIHWND;INSTANCE:3]" ist eh schon mal total falsch..."
    Mehr hat mir das Tool "Window Info" nicht verraten, weiß nicht was du da benutzt, um an
    "[CLASS:CabinetWClass; INSTANCE:1]"
    zu gelangen. In C++ scheint es jedenfalls die Funktion EnumWindows zu geben.

    ""WinWaitActive[CLASS:DirectUIHWND;INSTANCE:3]" --> WinWaitActive("[CLASS:DirectUIHWND; INSTANCE:3]", "", 3) ; 3 sec warten - und nicht bis in alle Ewigkeit!

    WinWaitActive greift zudem auch nicht bei DirectUIHWND, weil DirectUIHWND nicht die Klasse eines 'echtes Window', sondern die eines Controls ist - dass, in dem die Dateiliste angezeigt wird.
    DirectUIHWND wird dir im AutoIt Info-Tool aber auch unter "Basic Control Info" angezeigt! ;)

    AutoIt
    Local $sDrive = 'C:'
    Run('explorer.exe /e,' & $sDrive)
    
    
    ; liefert uns immer 0
    Local $hWnd = WinActivate("[CLASS:DirectUIHWND; INSTANCE:3]")
    ConsoleWrite('$hWnd = ' & $hWnd & @CRLF)
    
    
    ; liefert uns das Handle
    $hWnd = WinActivate('[CLASS:CabinetWClass; INSTANCE:1]')
    ConsoleWrite('$hWnd = ' & $hWnd & @CRLF)
    Alles anzeigen


    Für Controls liefern uns die Funktionen ControlFocus() und ControlGetFocus() die gewünschten Infos.

    ControlFocus() und ControlGetFocus()
    AutoIt
    Local $hWnd = WinActivate('[CLASS:CabinetWClass; INSTANCE:1]')
    If $hWnd Then
    	Local $sFocus = ControlGetFocus($hWnd)	; liefert uns den ClassNameNN dea aktiven Controls in dem Fenster, NN ist hier die Instance
    	Local $hControl = ControlGetHandle($hWnd, '', $sFocus)
    	ConsoleWrite('Handle des aktiven Controls ("' & $sFocus & '") im Explorer: ' & $hControl & @CRLF)
    	Local $hControl = ControlGetHandle($hWnd, '', '[CLASS:DirectUIHWND; INSTANCE:3]')
    	ControlFocus('', '', $hControl)	; setzt den Focus auf dieses Control
    	ConsoleWrite('Handle des aktiven Controls ("[CLASS:DirectUIHWND; INSTANCE:3]")  im Explorer ist jetzt: ' & $hControl & @CRLF)
    	Local $hControl = ControlGetHandle($hWnd, '', '[CLASS:SysTreeView32; INSTANCE:1]')
    	ControlFocus('', '', $hControl)	; setzt den Focus auf dieses Control
    	ConsoleWrite('Handle des aktiven Controls ("[CLASS:SysTreeView32; INSTANCE:1]") im Explorer ist jetzt: ' & $hControl & @CRLF)
    Else
    	Exit MsgBox(0, '', ' Es ist keine Explorer-Fester geöffnet...') +1
    EndIf
    Alles anzeigen


    In AutoIT gibt es die Funktion _WinAPI_EnumWindows()

    _WinAPI_EnumWindows()


    AutoIt
    #include <WinAPI.au3>
    Local $sDrive = 'C:'
    Run('explorer.exe /e,' & $sDrive)
    ; hier merken wir uns die zuletzt geöffnete (unsere) Instanz des Explorers
    Local $aExplorer = _WinAPI_EnumWindows('[CLASS:CabinetWClass]')		; CabinetWClass    --> dem AutoIt Info-Tool entnommen (Basic Window Info)
    Local $iLastInstace = UBound($aExplorer)				; Handle/Classname --> stehen hier in der Reihenfolge, in der sie geöffnet wurden
    Run('explorer.exe /e,' & $sDrive & '\Windows') ; anderen Pfad angeben, damit ein neues Explorer-Fenster geöffnet wird
    WinClose('[CLASS:CabinetWClass; INSTANCE:' & $iLastInstace & ']')	; die (von uns) zuletzt geöffnete Instanz des Explorers killen - und nicht irgendeine!

    EnumWindows.png

  • Problem mit MouseClick()

    • Bitnugger
    • 24. Juli 2016 um 07:32
    Zitat von igillan
    AutoIt
    #include <AutoItConstants.au3>
    WinActivate("MyPublicWifi")
    WinSetState("MyPublicWifi", "",@SW_MINIMIZE)
    MouseMove(970,308)
    ;MouseClick($MOUSE_CLICK_LEFT)
    $i=MouseClick("")
    MsgBox(4144, "Rückgabe",$i, 10)


    Wieso einfach, wenn es auch kompliziert geht... :thumbup:

    AutoIt
    ; MyPublicWifi Window minimieren
    WinSetState("MyPublicWifi", "",@SW_MINIMIZE)
    
    
    ; MyPublicWifi Window wieder anzeigen
    WinSetState("MyPublicWifi", "",@SW_RESTORE)

    Oder so...

    AutoIt
    Local $hWnd = WinGetHandle('[CLASS:TfrmMain]')
    WinActivate($hWnd)
    Local $iOldMouseCoordMode = Opt('MouseCoordMode', 2)
    MouseClick('primary', 292, 8, 1, 100)
    Opt('MouseCoordMode', $iOldMouseCoordMode)

    MouseClick.png

  • Senden von Text in Windows Explorer-Leiste mit anschließendem ENTER

    • Bitnugger
    • 24. Juli 2016 um 00:36

    Falls mal jemand die Klick-Variante braucht... wenn ein bereits geöffnetes Explorer-Fenster verwendet werden soll. ;)

    Bei mir (Win10) ist Instance = 3

    "WinWaitActive[CLASS:DirectUIHWND;INSTANCE:3]" ist eh schon mal total falsch...
    .
    Richtig wäre:

    Local $hWnd = WinWaitActive('[CLASS:CabinetWClass]', '', 3) ; 3 sec warten

    AutoIt
    _ExplorerGetDrive('C:', True)	; Explorer starten und Inhalt von Laufwerk C: anzeigen
    Sleep(3000)
    _ExplorerGetDrive('X:', False)	; warten bis ein Explorer-Fenster aktiv ist und Inhalt von Laufwerk X: anzeigen
    ;
    Func _ExplorerGetDrive($sDrive, $bStart = False)
    	If $bStart = True Then Return Run(@WindowsDir & '\explorer.exe /e,' & $sDrive)
    ;
    	; Window Classname
    	Local $sWinClass = '[CLASS:CabinetWClass]'
    	; ToolbarClass + Instance
    	Local $sToolbarClass = '[CLASS:ToolbarWindow32; INSTANCE:3]'
    	; Explorer starten
    	; Warten bis Explorer Window aktiv ist
    	Local $hWnd = WinWaitActive($sWinClass)
    	; Linksklick in die Adresszeile
    	ConsoleWrite(ControlClick($hWnd, '', $sToolbarClass, 'left') & @CRLF)
    	; Aktuellen Inhalt der Adresszeile löschen
    	; Laufwerksbuchstaben eintragen und mit Enter die Eingabe bestätigen/abschicken
    	ConsoleWrite(Send($sDrive & '{Enter}') & @CRLF)
    EndFunc
    Alles anzeigen

    EXPLORER_CLASS_INSTANCES_WIN_10.pngWindow_CLASS_INSTANCE.png

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™