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

  • Ausgabe von ConsoleWrite anschauen

    • Bitnugger
    • 2. April 2017 um 18:41

    Meinst du das in etwa so?

    Redirect
    AutoIt
    ;-- TIME_STAMP   2017-04-02 18:39:32   v 0.1
    
    
    #include <AutoItConstants.au3>
    #include <MsgBoxConstants.au3>
    
    
    Global $g_iPID, $g_sOutput, $g_sCMD = 'Dir /B /AD ' & @UserProfileDir
    
    
    _Read_CMD_Output()
    _Redirect_CMD_OutputToFile()
    _Redirect_CMD_OutputToEditor()
    
    
    Func _Read_CMD_Output()
    	$g_iPID = Run(@ComSpec & " /c " & $g_sCMD, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    
    
    	$g_sOutput = "StdoutRead_____________" & @CRLF
    	While 1
    		$g_sOutput &= StdoutRead($g_iPID)
    		If @error Then ExitLoop ; Exit the loop if the process closes or StdoutRead returns an error.
    	WEnd
    
    
    	$g_sOutput &= @CRLF & @CRLF & "StderrRead_____________" & @CRLF
    	While 1
    		$g_sOutput &= StderrRead($g_iPID)
    		If @error Then ExitLoop ; Exit the loop if the process closes or StderrRead returns an error.
    	WEnd
    	MsgBox($MB_SYSTEMMODAL, "Stdout Read / Stderr Read:", $g_sOutput)
    EndFunc
    
    
    Func _Redirect_CMD_OutputToFile()
    	; Redirect StdoutRead & StderrRead --> 2>&1>
    	; https://technet.microsoft.com/en-us/library/bb490982.aspx
    	RunWait(@ComSpec & " /c " & $g_sCMD & ' 2>&1> ' & @TempDir & '\CMDOUT.txt', '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    
    
    	$g_sOutput = "'FileRead(@TempDir & '\CMDOUT.txt')" & @CRLF & @CRLF
    	$g_sOutput &= FileRead(@TempDir & '\CMDOUT.txt')
    	MsgBox($MB_SYSTEMMODAL, "Stdout Read / Stderr Read:", $g_sOutput)
    
    
    	; delete the file
    	FileDelete(@TempDir & '\CMDOUT.txt')
    EndFunc
    
    
    Func _Redirect_CMD_OutputToEditor()
    	RunWait(@ComSpec & " /c " & $g_sCMD & ' 2>&1> ' & @TempDir & '\CMDOUT.txt', '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    
    
    	; Open the file in our default editor
    	ShellExecute(@TempDir & '\CMDOUT.txt')
    	Sleep(3000)
    
    
    	; delete the file
    	FileDelete(@TempDir & '\CMDOUT.txt')
    EndFunc
    Alles anzeigen
  • _String_MultiReplace UDF

    • Bitnugger
    • 2. April 2017 um 17:36
    Zitat von NO1 :-)

    Bei Fehler, Bugs oder Sonstigem bitte schreiben.

    Jeep... schaue dir mal die Ergebnisse von meinem Script an und vergleiche sie mit deinem...

    AutoIt
    ;-- TIME_STAMP   2017-04-02 17:48:20
    
    
    Global $g_sNewString = _String_MultiReplace('Huhu Huhu duda', 'u|H|a| ', 'i|L|X')
    ConsoleWrite('> $g_sNewString = "' & $g_sNewString & '"' & @CRLF & '! Es wurden ' & @extended & ' Zeichen ersetzt!' & @CRLF)
    
    
    Global $g_aSearch = ['u', 'ck', 'wer', 'K', 'eni'], $g_aReplace = ['i', 'chen', 'was', 'M', 'elien']
    ConsoleWrite('> $sNewString = "' & _String_MultiReplace('Kuckuck, wer da?', $g_aSearch, $g_aReplace) & '"' & @CRLF & '! Es wurden ' & @extended & ' Zeichen ersetzt!' & @CRLF)
    
    
    Func _String_MultiReplace($sString, $vSearch, $vReplace, $sSearchSeparator = "|", $sReplaceSeparator = "|")
    	Local $aSearch[1], $aReplace[1], $iReplace = 0
    	If IsArray($vSearch) Then
    		$aSearch = $vSearch
    	Else
    		$aSearch = StringSplit($vSearch, $sSearchSeparator, 2)
    		If @error Then $aSearch[0] = $vSearch
    	EndIf
    	If IsArray($vReplace) Then
    		$aReplace = $vReplace
    	Else
    		$aReplace = StringSplit($vReplace, $sReplaceSeparator, 2)
    		If @error Then $aReplace[0] = $vReplace
    	EndIf
    	If UBound($aReplace) < UBound($aSearch) Then ReDim $aReplace[UBound($aSearch)]
    	ConsoleWrite(StringFormat('+ %-11s = "%s"\n', '$sString', $sString))
    	For $i = 0 To UBound($aSearch) -1 Step 1
    		$sString = StringReplace($sString, $aSearch[$i], $aReplace[$i])
    		$iReplace += @extended * StringLen($aSearch[$i])
    		ConsoleWrite(StringFormat('- %-11s = %-36s %s %-20s %-20s %-20s $iReplace = %5i\n', '$sString', '"'&$sString&'"', 'Replace ', '"' & $aSearch[$i] & '"', ' <-> ', '"' & $aReplace[$i] & '"', $iReplace))
    	Next
    	Return SetExtended($iReplace, $sString)
    EndFunc
    Alles anzeigen
  • Tool: Datei(en) - Setzen von Datum Create/Modified

    • Bitnugger
    • 2. April 2017 um 14:20

    Sehr schön... vom Total Commander her kenne ich das bereits in sehr ähnlicher Form... da ich mit meinem Tool gerade auf der Stelle trete, war ich so frei und habe es etwas umgebaut, so dass wahlweise Verzeichnisse und/oder Dateien bearbeiten werden können.

    Dateien

    MultiFileSetTime[0.4].au3 8,7 kB – 271 Downloads
  • ExtractAssociatedIcon, ExtractIconExW, ExtractIcon mit Autoit3

    • Bitnugger
    • 2. April 2017 um 11:39
    Zitat von BugFix

    Vielleicht kannst du ja auch den IconFileScanner von Holger Kotsch verwenden. Nutze ich immer, um mir die Icon in exe/dll anzusehen.

    Mit Windows 10 funktioniert der IconFileScanner jedenfalls nicht, da er nur wenige der "gefundenen Icons" anzeigt und mit der tatsächlich vorhandenen Anzahl auch total daneben liegt. Zudem will ich mir die Icons nicht nur anschauen können, sondern sie auch in dem von mir gewünschten Format speichern können, was in meinem Tool auch funktioniert.

    Beispiel: explorer.exe
    Der IconFileScanner findet 29 Icon groups, meint aber, es seien Icons, zeigt davon nur 2 an... beide aus der ersten Icon group... beide in derselben Größe 32x32.
    Mein Tool findet 29 Icon groups und insgesamt 233 Icons... zeigt davon 5 NICHT an... und alle in der Original-Größe!

    Derzeit kämpfe ich noch mit zwei Problemen...

    • Wie bekomme ich die Icons ($hIcon) mit Transparenz in das Pic-Control ($hBitmap)?
    • Wie bringe ich GDIPlus dazu, auch Icons die nur zwei Farben haben, als Bitmap anzuzeigen? (die 5 Icons, die in meinem Bild komplett schwarz sind...)

    Erstes Problem habe ich versucht mit _ScreenCapture_CaptureWnd() zu lösen, wobei die Transparenz soweit auch erhalten bleibt, aber das Bild insgesamt blasser wird.

    IconFileScanner.png_ExtractIcon.png _ScreenCapture_CaptureWnd.png

  • ExtractAssociatedIcon, ExtractIconExW, ExtractIcon mit Autoit3

    • Bitnugger
    • 1. April 2017 um 16:38
    Zitat von Candyland

    Ich kann mir gut vorstellen das hierbei Probleme entstehen werden.

    Nein, die Sache muss man dann lediglich anders angehen... wenn du willst kann ich dir ja schon mal das unfertige Script hier hochladen, damit du darin schnuppern kannst, wie es in dem Fall gemacht werden kann.

    Zitat von Candyland

    Ja danke dir, ich hätte die frage allerdings besser formulieren sollen, mir ist nicht bewusst woher ich weiß wie die Ganze zeile auszufüllen ist, $Path kam von mir doch von dem rest der Zeile weiß ich nichts. (hier markiert mit fragezeichen)
    Local $Ret = DllCall('shell32', 'long(?)', ''ExtractIconExW', 'int(?)', 0(?), 'str(?)', $Path, 'int*(?)', 1(ICON))

    Mehr gibt es in dieser Zeile nicht, was du da noch ausfüllen müsstest. Hier mal ein erleuchtender Link für dich zu einer super Seite von @BugFix: Dll-Tutorial für AutoIt

    Noch ein Tip... wenn du in SciTE mit dem Caret auf einem Funktionsnamen stehts, kannst du mit Strg + j zu dieser Funktion springen, auch wenn diese mit den Includes geladen wurde. Dort kannst du dir dann anschauen, wie der DllCall auszusehen hat und welche Parameter hier erwartet werden.

    Hier ein Bsp:

    AutoIt
    Func _WinAPI_ShellExtractIcon($sIcon, $iIndex, $iWidth, $iHeight)
    	Local $aRet = DllCall('shell32.dll', 'int', 'SHExtractIconsW', 'wstr', $sIcon, 'int', $iIndex, 'int', $iWidth, _
    			'int', $iHeight, 'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0)
    	If @error Or Not $aRet[0] Or Not $aRet[5] Then Return SetError(@error, @extended, 0)
    	; If Not $aRet[0] Then Return SetError(1000, 0, 0)
    
    
    	Return $aRet[5]
    EndFunc   ;==>_WinAPI_ShellExtractIcon
  • ExtractAssociatedIcon, ExtractIconExW, ExtractIcon mit Autoit3

    • Bitnugger
    • 1. April 2017 um 00:46
    Zitat von Candyland

    So kam ich auf die idee gleich eine Ganze icon gruppe herauszuladen...

    Wieso nicht gleich alle?

    Mit alle meine ich, alle vorhandenen Icons anzeigen und dann auswählen, welche davon in welchem Format (jpg, png, ...) gespeichert werden sollen.
    Ich habe ein halb fertiges Script, mit dem das geht... werde mich die Tage mal dran setzen und es fertig schreiben.

    Zitat von Candyland

    Keine ahnung wie ich die Zeile zu füllen habe :<

    Wenn du mit Dll-Calls noch nicht so gut bewandert bist, solltest du besser die dafür bereits vorhandenen API-Funktionen benutzen.

    Zitat von Candyland

    Local $Ret = DllCall('shell32', 'long', ''ExtractIconExW', 'int', 0, 'str', $Path, 'int*', 1)

    $Path, der Name der Exe, Dll oder des Icons/Icon-Library (*.icl), von dem das Icon extrahiert werden soll, ist der einzige Parameter, den du vor dem Aufruf deklarieren musst.

    Hier schon mal vorab eine minimalistische Lösung für dich.

    AutoIt
    ;-- TIME_STAMP   2017-04-01 02:11:41   v 0.1
    
    
    #include <GDIPlus.au3>
    #include <WinAPIGdi.au3>
    #include <WinAPIShellEx.au3>
    #include <WinAPIShPath.au3>
    
    
    Global $aExtract = ['c:\Program Files (x86)\AutoIt3\AutoIt3.exe', @SystemDir & '\shell32.dll']
    Global $sSavePath = 'm:\'	; mit abschließendem Backslash!
    Global $sFormat = '.ico' ; '.jpg', '.png', '...'
    Global $iIndex = 0, $iWidth = 48, $iHeight = 48
    
    
    _ExtractIcon($aExtract, $iIndex, $iWidth, $iHeight, $sFormat, $sSavePath)
    _ExtractIcon('C:\Windows\explorer.exe', 3, 32, 32, '.jpg', 'm:\')
    _ExtractIcon('C:\Program Files (x86)\Mozilla Firefox\firefox.exe', 1, 32, 32, '.png', 'm:\')
    
    
    Func _ExtractIcon($vExtract, $iIndex, $iWidth, $iHeight, $sFormat, $sSavePath)
    	Local $aExtract[1], $bDelete = True, $sSaveAs, $sCLSID, $hBitmap, $sCLSID
    
    
    	; Initialize GDI+ library
    	_GDIPlus_Startup()
    
    
    	$sExt = _WinAPI_PathFindExtension($sSavePath)
    
    
    	If IsArray($vExtract) Then
    		$aExtract = $vExtract
    	Else
    		$aExtract[0] = $vExtract
    	EndIf
    	For $i = 0 To UBound($aExtract) - 1 Step 1
    		$sSaveAs = $sSavePath & _WinAPI_PathRemoveExtension(_WinAPI_PathStripPath($aExtract[$i])) & '_' & StringFormat('%03i', $i) & $sFormat
    
    
    		$hIcon = _WinAPI_Create32BitHICON(_WinAPI_ShellExtractIcon($aExtract[$i], $iIndex, $iWidth, $iHeight), $bDelete)
    		If $hIcon = 0 Then ExitLoop ; kein Icon vorhanden oder Index zu hoch!
    
    
    		If $sExt = '.ico' Then
    			_WinAPI_SaveHICONToFile($sSaveAs, $hIcon)
    		Else
    			; Get encoder CLSID
    			$sCLSID = _GDIPlus_EncodersGetCLSID(StringTrimLeft($sExt, 1))
    			$hBitmap = _GDIPlus_BitmapCreateFromHICON($hIcon)
    			_GDIPlus_ImageSaveToFileEx($hBitmap, $sSaveAs, $sCLSID)
    			_GDIPlus_BitmapDispose($hBitmap)
    		EndIf
    
    
    		_WinAPI_DestroyIcon($hIcon)
    	Next
    
    
    	; Shut down GDI+ library
    	_GDIPlus_Shutdown()
    EndFunc   ;==>_ExtractIcon
    Alles anzeigen
  • Wenn ordner nicht vorhanden, zum nächstern springen

    • Bitnugger
    • 22. März 2017 um 09:34
    Zitat von DerSchatten

    Ich würde aber gerne die Nummer des eigentlichen Ordners suchen können also nicht Nummer der ordnerzahl.
    Wenn du weißt was ich meine.

    Ja, weiß ich. Ich werde dir das noch einbauen... dafür muss ich den Code aber komplett umbauen... in ca. 1-3 Stunden werde ich es wohl fertig haben.

  • Ideen für dynamisches Nippelboard

    • Bitnugger
    • 21. März 2017 um 13:59

    Das hier kannst du bestimmt auch gut gebrauchen: https://www.autoitscript.com/forum/topic/96…sctls_hotkey32/

  • Befehl "hidden" ausführen

    • Bitnugger
    • 21. März 2017 um 13:28
    Zitat von AutoItler

    Deine Lösung, 'Bitnugger' ist perfekt und funktioniert. Bloß, wie kommt man denn auf solche Lösungswege?

    Das ist eigentlich sehr einfach... gesucht hatte ich in der Hilfe nach *locale* (Haken bei "Nur Titel suchen" setzen), um mir dann die gefunden WinAPI-Funktionen unter die Lupe zu nehmen. Direkt bei der ersten von mir ausgesuchten Funktion hatte ich dann bereits die Lösung vor Augen: _WinAPI_GetThreadLocale(). Das Beispiel anschauen... der Rest ist dann quasi selbsterklärend...

    LoadString()
    AutoIt
    ;-- TIME_STAMP   2017-03-21 13:14:56   v 0.1
    
    
    #include <Array.au3>
    #include <APILocaleConstants.au3>
    #include <APIResConstants.au3>
    #include <MsgBoxConstants.au3>
    #include <WinAPI.au3>
    #include <WinAPILocale.au3>
    #include <WinAPIRes.au3>
    #include <WinAPISys.au3>
    
    
    ;~ #include <WinAPI.au3>
    
    
    Local $hInstance = _WinAPI_LoadLibraryEx('InetCpl.cpl', $LOAD_LIBRARY_AS_DATAFILE)
    If Not $hInstance Then
    	MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Error', 'InetCpl.cpl not found.')
    	Exit
    EndIf
    
    
    ; Get the language (locale) identifier for the current process
    Local $iPrev, $GetLocale, $SetLocale
    ;~ If _WinAPI_GetVersion() >= '6.0' Then <-- Was für ein Quatsch... denn bei einem Stringvergleich ist "10.0" < "6.0" und somit "Windows 10" < "Windows Longhorn"!!!
    ConsoleWrite('! _WinAPI_GetVersion() liefert als Ergebnis: ' & VarGetType(_WinAPI_GetVersion()) & @CRLF & _
    	'! Vergleichen werden muss also so:' & @CRLF & _
    	'> If _WinAPI_GetVersion() >= 6.0 Then ' & @CRLF & _
    	'> If ' & _WinAPI_GetVersion() & " >= " & 6.0 & ' Then' & @CRLF & @CRLF)
    ; Das kennst du ja bereits... ;-)
    If _WinAPI_GetVersion() >= 6.0 Then
    	$GetLocale = _WinAPI_GetThreadUILanguage
    	$SetLocale = _WinAPI_SetThreadUILanguage
    Else
    	$GetLocale = _WinAPI_GetThreadLocale
    	$SetLocale = _WinAPI_SetThreadLocale
    EndIf
    $iPrev = $GetLocale()
    
    
    ; Why is the resource name for the string with ID = 6000 is 376? 6000 / 16 + 1 = 376
    Local $aData = _WinAPI_EnumResourceLanguages($hInstance, $RT_STRING, 376)
    If Not @error Then
    	For $i = 1 To $aData[0]
    ;~ 		If _WinAPI_GetVersion() >= '6.0' Then
    ;~ 			_WinAPI_SetThreadUILanguage($aData[$i])
    ;~ 		Else
    ;~ 			_WinAPI_SetThreadLocale($aData[$i])
    ;~ 		EndIf
    		$SetLocale($aData[$i])
    		ConsoleWrite(StringFormat('+ %-10s - %s', _WinAPI_GetLocaleInfo($aData[$i], $LOCALE_SENGLANGUAGE), _WinAPI_LoadString($hInstance, 6000)) & @CRLF)
    		If $aData[$i] = 1031 Then	; German - International
    			Local $j = -1, $idMatch = -1, $k = FileGetSize(@SystemDir & '\InetCpl.cpl')
    			Do
    				$j += 1
    				If StringLeft(_WinAPI_LoadString($hInstance, $j), 22) = 'Browserverlauf löschen' Then $idMatch = $j
    			Until $idMatch > -1 Or $j > $k
    			ConsoleWrite('- Bingo... --> $idMatch = ' & $idMatch & ' --> "' & _WinAPI_LoadString($hInstance, $j) & '"' & @CRLF & @CRLF)
    		EndIf
    	Next
    EndIf
    
    
    ; Restore the previous language for the current process
    ;~ If _WinAPI_GetVersion() >= '6.0' Then
    ;~ 	_WinAPI_SetThreadUILanguage($iPrev)
    ;~ Else
    ;~ 	_WinAPI_SetThreadLocale($iPrev)
    ;~ EndIf
    $SetLocale($iPrev)
    Alles anzeigen
  • Wenn ordner nicht vorhanden, zum nächstern springen

    • Bitnugger
    • 21. März 2017 um 10:22
    Zitat von DerSchatten

    Hast du das da schon implementiert?

    Ja, habe ich... dann hast du wohl noch die alte Version...

  • Registry Key Flag setzen um Script zu steuern?

    • Bitnugger
    • 20. März 2017 um 23:46
    Zitat von olfibits

    @Bitnugger Ich meine sicherer als das INI. Jetzt kapiert?

    Es geht nicht darum, ob ich etwas kapiere... und hier machst du es schon wieder... lieferst keine Begründung, warum es sicherer ist!

    Zitat von olfibits

    @BugFix ja klar. Aber was ist, wenn so ein sinnfreier Schwachsinn wie TuneUp&Co. auf dem Rechner des Endbenutzers ist, der alle naselang mal die Temp files löscht?
    Ein Reg Cleaner lässt idR die Pfoten weg von den Softwareeintragen bzw ein Virus einen banalen Installed=1 Key. Meine Begründung.

    Ja, das ist eine Begründung, wie ich sie bereits nach meiner ersten Frage gerne bekommen hätte! Die Antwort von@'BugFix' sollte dir aber nun aufzeigen, dass dem nicht so ist, zumal in "C:\Users\USER\AppData\Local" ganz sicher kein Registry Cleaner etwas löscht.

  • Registry Key Flag setzen um Script zu steuern?

    • Bitnugger
    • 20. März 2017 um 19:36
    Zitat von olfibits

    Das sagt doch alles, oder? Oder formuliere ich so uneindeutig?

    Nein, das sagt nichts! Meine Frage war unmissverständlich, deine Ausführung quasi nur eine Wiederholung des bereits Gesagten.

    Wenn du der Meinung bist, dass die Registry ein sichereren Speicherort vor Löschungen ist, solltest du das auch begründen können... und genau das war meine Frage.
    Was bitte ist denn daran sicherer?

  • Registry Key Flag setzen um Script zu steuern?

    • Bitnugger
    • 20. März 2017 um 16:38
    Zitat von olfibits

    @chip ich glaube, der Key soll danach auch noch existieren.

    Nein, weil...

    Zitat von olfibits

    Oder muss das Programm neustarten?

    Schreibt er doch...

    Zitat von Simon09

    Da dazwischen ein Neustart sein kann,

    Zitat von olfibits

    wobei ich die Registry als sichereren Speicherort vor Löschungen halte.

    Was bitte ist denn daran sicherer?

  • Wenn ordner nicht vorhanden, zum nächstern springen

    • Bitnugger
    • 20. März 2017 um 16:14
    Zitat von DerSchatten

    jetzt hätte ich noch einen Wunsch:

    Wenn ich die Ordnernummer im Feld $g_idInput_skNr manuell eingebe, soll der Ordner-Zähler auch gleich dort hin springen und mit VOR und ZURÜCK ab dieser Zahl zählen.

    Ok...

    F2 = Fokus auf $g_idInput_skNr setzen
    F5 = Index auf 1 setzen
    F6 = Index auf $g_aDirList[0] setzen (letztes Verzeichnis)

    Edit: Habe noch ein paar kleine Änderungen gemacht...

    Prev-Next Dir 2
    AutoIt
    ;-- TIME_STAMP   2017-03-20 16:27:39   v 0.1
    
    
    #Region    ;************ Includes ************
    #Include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <File.au3>
    #include <WinAPI.au3>
    #EndRegion ;************ Includes ************
    
    
    Opt('MustDeclareVars', 1)
    
    
    Global $g_sFilePath = "\\Brzg.local\shares\PIV\KONF\BRZ\PAR\"
    Global $g_iCurrentDir = 1, $g_hGUI, $g_idInput_Dir, $g_idInput_skNr, $g_idButton_Prev, $g_idButton_Next, $g_idDummyF2, $g_idDummyF5, $g_idDummyF6
    Global $g_aDirList = _GetDirList($g_sFilePath)
    
    
    #region - GUI Create
    $g_hGUI = GUICreate('Prev-Next Dir', 640, 65)
    $g_idInput_Dir   = GUICtrlCreateInput('', 10, 5, 100, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
    $g_idInput_skNr  = GUICtrlCreateInput('', 120, 5, 510, 21)
    $g_idButton_Prev = GUICtrlCreateButton('Vorheriges Verzeichnis', 10, 35, 305, 24)
    $g_idButton_Next = GUICtrlCreateButton('Nächstes Verzeichnis', 325, 35, 305, 24)
    $g_idDummyF2 = GUICtrlCreateDummy()
    $g_idDummyF5 = GUICtrlCreateDummy()
    $g_idDummyF6 = GUICtrlCreateDummy()
    
    
    _Main()
    
    
    Func _Main()
    	Local $aAccelKeys[3][2] = [["{F2}", $g_idDummyF2], ["{F5}", $g_idDummyF5], ["{F6}", $g_idDummyF6]]
    	GUISetAccelerators($aAccelKeys)
    
    
    	GUISetState()
    	#endregion
    
    
    	_SetDir(1)
    	ControlFocus($g_hGUI, '', $g_idInput_Dir)
    
    
    	#region - GUI SelectLoop
    	Local $msg, $iChangeIndex, $iFokus, $vText
    	While 1
    		$msg = GUIGetMsg()
    
    
    		$iFokus = _WinAPI_GetDlgCtrlID(ControlGetHandle($g_hGui, '', ControlGetFocus($g_hGui)))
    		$vText = GUICtrlRead($g_idInput_skNr)
    		If $iFokus = $g_idInput_skNr Then
    			If $vText <> '' And Int($vText) = 0 Then GUICtrlSetData($g_idInput_skNr, '')
    		ElseIf $msg <> $g_idButton_Prev And $msg <> $g_idButton_Next Then
    			If $vText = '' Or $vText <> $g_aDirList[$g_iCurrentDir] Then GUICtrlSetData($g_idInput_skNr, $g_sFilePath & $g_aDirList[$g_iCurrentDir])
    		EndIf
    
    
    		Select
    			Case $msg = $GUI_EVENT_CLOSE
    				Exit
    			Case $msg = $g_idInput_skNr
    				ConsoleWrite('$g_idInput_skNr' & @CRLF)
    				$iChangeIndex = GUICtrlRead($g_idInput_skNr)
    				If Int($iChangeIndex) > 0 And Int($iChangeIndex) < $g_aDirList[0] Then
    					_SetDir($iChangeIndex)
    					ControlFocus($g_hGUI, '', $g_idInput_Dir)
    				EndIf
    			Case $msg = $g_idButton_Prev
    				_SetDir($g_iCurrentDir -1)
    			Case $msg = $g_idButton_Next
    				_SetDir($g_iCurrentDir +1)
    			Case $msg = $g_idDummyF2
    					If $iFokus <> $g_idInput_skNr Then ControlFocus($g_hGUI, '', $g_idInput_skNr)
    			Case $msg = $g_idDummyF5
    				_SetDir(1)
    			Case $msg = $g_idDummyF6
    				_SetDir($g_aDirList[0])
    		EndSelect
    	WEnd
    	#endregion
    EndFunc
    
    
    Func _SetDir($iDir)
    	If $iDir < 1 Or $iDir > $g_aDirList[0] Then Return
    	$g_iCurrentDir = $iDir
    	GUICtrlSetData($g_idInput_skNr, $g_sFilePath & $g_aDirList[$g_iCurrentDir])
    	GUICtrlSetData($g_idInput_Dir, StringFormat('[%i/%i]', $g_iCurrentDir, $g_aDirList[0]))
    	ControlFocus($g_hGUI, '', $g_idInput_Dir)
    EndFunc
    
    
    Func _GetDirList($sFilePath)
    	Local $aDirList = _FileListToArray($g_sFilePath, "*", $FLTA_FOLDERS, False)
    	Switch @error
    		Case 1
    			Exit 1 + MsgBox(262160, 'Prev-Next Dir', 'Folder not found or invalid')
    		Case 2
    			Exit 2 + MsgBox(262160, 'Prev-Next Dir', 'Invalid $sFilter')
    		Case 3
    			Exit 3 + MsgBox(262160, 'Prev-Next Dir', 'Invalid $iFlag')
    		Case 4
    			Exit 4 + MsgBox(262160, 'Prev-Next Dir', 'No File(s) Found')
    	EndSwitch
    	Return $aDirList
    EndFunc
    Alles anzeigen
  • Wenn ordner nicht vorhanden, zum nächstern springen

    • Bitnugger
    • 20. März 2017 um 14:57
    Zitat von DerSchatten

    Wozu genau benötigt man diese Variable:
    Global $g_iCurrentDir = 1, $g_hGUI, $input_sknummer, $button_zurueck, $button_vor


    In dieser Zeile habe ich 5 Variablen deklariert...
    Das GUI-Handle benötigst du, wenn du deine GUI z. B. minimieren willst. Z. B.: GUISetState($g_hGUI, @SW_MINIMIZE)
    Die Control-IDs benötigst du, damit du in der Select-Loop-Schleife auswerten kannst, ob eines der Controls (einer der Buttons) angeklickt wurde.
    $g_iCurrentDir = In dieser Variablen steht immer der Index des aktuell angezeigten Verzeichnisses in dem Array $g_aDirList
    $g_hGUI = Handle der GUI ; wird hier nicht verwendet, ist bei mir aber Usus.
    $g_idInput_skNr = ID des Input-Controls für die Anzeige des Index: [Index des angezeigten Verzeichnisses in $g_aDirList / Anzahl der Verzeichnisse in $g_aDirList]
    $g_idButton_Prev = ID des Button-Controls (Vorheriges Verzeichnis), mit dem du den Index des Verzeichnisses um 1 veringern kannst.
    $g_idButton_Next = ID des Button-Controls (Nächstes Verzeichnis), mit dem du den Index des Verzeichnisses um 1 erhöhen kannst.

    Zitat von DerSchatten

    ist da ein Schreibfehler drinn, weil die Variable $g_idInput_skNummer gibt es ja sonst nicht.

    Jeep, das ist ein Dummfehler... und $g_idInput_Dir habe ich gar nicht deklariert... ;)

    Wenn du folgende Zeile an den Anfang deiner Scripte setzt, passiert dir sowas nicht:

    AutoIt
    Opt('MustDeclareVars', 1)


    Ich hab das Script nun aktualisiert und diese marginalen Fehler behoben.

  • Befehl "hidden" ausführen

    • Bitnugger
    • 20. März 2017 um 14:11
    Zitat von chesstiger

    Vorsicht bei solchen Lösungen. Das ist alles andere als sauber. Da nach einem Fenster mit Titel "Browserverlauf" gesucht wird, funktioniert diese Variante nur bei deutschsprachigen Windows-Installationen.


    Damit hast du vollkommen Recht, zumindest dann, wenn das Script auch von anderen Leuten benutzt wird.

    Hier also eine Lösung, bei der die Locale beachtet wird...

    AutoIt
    #include <WinAPI.au3>
    
    
    Run('RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255', @SystemDir, @SW_HIDE)
    If WinSetState(WinWait('[CLASS:#32770; TITLE:' & _WinAPI_LoadString(_WinAPI_LoadLibraryEx(@SystemDir & '\InetCpl.cpl', $LOAD_LIBRARY_AS_DATAFILE), 1657) & ']', '', 5), '', @SW_MINIMIZE) = 0 Then _
    	ConsoleWrite('Fehler bei Run()!' & @CRLF)
  • Befehl "hidden" ausführen

    • Bitnugger
    • 20. März 2017 um 11:55
    AutoIt
    Run('RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255', @SystemDir, @SW_HIDE)
    If WinSetState(WinWait('Browserverlauf'), '', @SW_MINIMIZE) = 0 Then ConsoleWrite('Fehler bei Run()!' & @CRLF)
  • Wenn ordner nicht vorhanden, zum nächstern springen

    • Bitnugger
    • 20. März 2017 um 11:14

    So meinte @BugFix das...

    Prev-Next Dir
    AutoIt
    ;-- TIME_STAMP   2017-03-20 14:46:28   v 0.1
    
    
    ;-- TIME_STAMP   2017-03-20 11:28:01   v 0.1
    
    
    #Region    ;************ Includes ************
    #Include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <File.au3>
    #EndRegion ;************ Includes ************
    
    
    Opt('MustDeclareVars', 1)
    
    
    Global $g_sFilePath = "\\Brzg.local\shares\PIV\KONF\BRZ\PAR\"
    Global $g_iCurrentDir = 1, $g_hGUI, $g_idInput_Dir, $g_idInput_skNr, $g_idButton_Prev, $g_idButton_Next
    Global $g_aDirList = _FileListToArray($g_sFilePath, "*", $FLTA_FOLDERS, False)
    Switch @error
    	Case 1
    		Exit 1 + MsgBox(262160, 'Prev-Next Dir', 'Folder not found or invalid')
    	Case 2
    		Exit 2 + MsgBox(262160, 'Prev-Next Dir', 'Invalid $sFilter')
    	Case 3
    		Exit 3 + MsgBox(262160, 'Prev-Next Dir', 'Invalid $iFlag')
    	Case 4
    		Exit 4 + MsgBox(262160, 'Prev-Next Dir', 'No File(s) Found')
    EndSwitch
    
    
    #region - GUI Create
    $g_hGUI = GUICreate('Prev-Next Dir', 640, 65)
    $g_idInput_Dir   = GUICtrlCreateInput('', 10, 5, 100, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY))
    $g_idInput_skNr  = GUICtrlCreateInput('', 120, 5, 510, 21)
    $g_idButton_Prev = GUICtrlCreateButton('Vorheriges Verzeichnis', 10, 35, 305, 24)
    $g_idButton_Next = GUICtrlCreateButton('Nächstes Verzeichnis', 325, 35, 305, 24)
    _SetDir(1)
    GUISetState()
    #endregion
    
    
    #region - GUI SelectLoop
    Local $msg
    While 1
    	$msg = GUIGetMsg()
    	Select
    		Case $msg = $GUI_EVENT_CLOSE
    			Exit
    		Case $msg = $g_idButton_Prev
    			_SetDir($g_iCurrentDir -1)
    		Case $msg = $g_idButton_Next
    			_SetDir($g_iCurrentDir +1)
    	EndSelect
    WEnd
    #endregion
    
    
    Func _SetDir($iDir)
    	If $iDir < 1 Or $iDir > $g_aDirList[0] Then Return
    	$g_iCurrentDir = $iDir
    	GUICtrlSetData($g_idInput_skNr, $g_sFilePath & $g_aDirList[$g_iCurrentDir])
    	GUICtrlSetData($g_idInput_Dir, StringFormat('[%i/%i]', $g_iCurrentDir, $g_aDirList[0]))
    EndFunc
    Alles anzeigen
  • _FTP_FilePut im Passiv mode => Fehler 12003

    • Bitnugger
    • 10. März 2017 um 03:53

    Wie der Server anzusprechen ist, entscheidet sich dadurch, wie er konfiguriert wurde bzw. welche Verbindungen er zulässt.

    Code
    ftp://   | ftpes:// --> FTP - File Transfer Protocol - Verschlüsselung: Wenn verfügbar, explizites FTP über TLS verwenden
             | ftpes:// --> FTP - File Transfer Protocol - Verschlüsselung: Explizites FTP über TLS erfordern
             | ftps://  --> FTP - File Transfer Protocol - Verschlüsselung: Implizites FTP über TLS erfordern   (veraltet - sollte nicht mehr verwendet werden)
    ftp://   |          --> FTP - File Transfer Protocol - Verschlüsselung: Nur unverschlüsseltes FTP verwenden (unsicher)
    
    
    sftp://  | ........ --> SFTP - SSH File Transfer Protocol

    Was ist der Unterschied zwischen FTPS Implizit und Explizit?

    Zitat von Candyland

    wenn ich ich mir ftp adressen so ansehe haben viele dieses ftp. vor ihrer adresse weshalb ich schnell mich dazu verleiten ließ das auch zu testen o:

    Wenn du dein hostname so konfiguriert hast, dann kannst du ihn auch so angeben... angenommen du hast dir einen kostenlosen Domaineintrag von http://freedns.afraid.org/ besorgt,
    könnte das so aussehen:
    frei.wählbar.aus Liste.auswählen
    CandyLand.mooo.com
    www.CandyLand.mooo.com
    ftp.CandyLand.mooo.com
    ftps.CandyLand.mooo.com
    ftpes.CandyLand.mooo.com

    Und so rufst du sie dann z. B. im Browser/Client auf:
    http://www.CandyLand.mooo.com
    ftpes://ftp.CandyLand.mooo.com

    Wenn dein Server den Clients die externe IP senden soll, muss er auch angewiesen werden, sich diese zu holen, anderfalls verwendet er die interne.

    Mit dem Filezilla-Server machst du das z. B. so:
    Filezilla-Server.png

  • _FTP_FilePut im Passiv mode => Fehler 12003

    • Bitnugger
    • 9. März 2017 um 11:08
    Zitat von Candyland

    ;~ Local $FURL = "ftp." & $SURL ;<=ftp. = error

    Bei 'http://' machst du es richtig... wieso dann bei 'ftp.' einen Punkt?

    Hier mal ein kleines Script für dich...

    FTP-DEMO
    AutoIt
    ;-- TIME_STAMP   2017-03-09 11:00:23   v 0.1
    
    
    #include <Array.au3>
    #include <Debug.au3>
    #include <FTPEx.au3>
    #include <Inet.au3>
    #include <WinAPIShPath.au3>
    
    
    Global $g_hOpen, $g_hConn
    Global $sSpacer = @CRLF & '------------------------------------------------------------------------' & @CRLF
    Global $g_sIP, $g_sServer = 'adresse.net'
    Global $g_sUsername = 'RemoteUser'
    Global $g_sPass = 'Remote'
    Global $g_iPassive = 1
    Global $g_iPort = 5063
    
    
    _Main()
    
    
    Func _Main()
    
    
    	OnAutoItExitRegister('_Exit')
    
    
    	_OpenDebugWin()
    
    
    	TCPStartup()
    
    
    	$g_sIP = TCPNameToIP($g_sServer)
    	_DebugOut('IP   = ' & $g_sIP)
    	_DebugOut('Name = ' & _TCPIpToName($g_sIP) & @CRLF)
    	ConsoleWrite(@CRLF)
    	$g_hOpen = _FTP_Open('FTP-DEMO')
    	Local $pCallback = _FTP_SetStatusCallback($g_hOpen, 'FTPStatusCallbackHandler')
    
    
    	$g_hConn = _FTP_Connect($g_hOpen, $g_sIP, $g_sUsername, $g_sPass, $g_iPassive, $g_iPort, $INTERNET_SERVICE_FTP, $INTERNET_FLAG_TRANSFER_BINARY, $pCallback)
    	If @error Then
    		Local $iERROR = @error, $iExtended = @extended, $sMessage = ""
    		_FTP_GetLastResponseInfo($iError, $sMessage)
    		Exit MsgBox($MB_SYSTEMMODAL, _
    			'_FTP_Connect', _
    			$sSpacer & _
    			$sMessage & @CRLF & _
    			'#ERROR = ' & $iERROR & @CRLF & _
    			'#Extended = ' & @extended & _
    			$sSpacer)
    
    
    	Else
    		_CheckURLs()
    
    
    		; Akktuelles Verzeichnis vom Server erfragen.
    		Local $sFTP_CurrentDir = _FTP_DirGetCurrent($g_hConn)
    		_DebugOut('$sFTP_CurrentDir = ' & $sFTP_CurrentDir)
    
    
    		; Verzeichnisliste vom Server holen
    		Local $aFTP_DirList = _GetFTP_List()
    		If @error Then Exit 2 + _PrintDebugMessage('_GetFTP_List')
    
    
    		; In das erste Verzeichnis aus dieser Liste wechseln. (bei mir /Audio)
    		_FTP_DirSetCurrent($g_hConn, $sFTP_CurrentDir & $aFTP_DirList[1][0])
    		If @error Then Exit 3 + _PrintDebugMessage('_FTP_DirSetCurrent')
    
    
    		Local $sFTP_ChangeDir = _FTP_DirGetCurrent($g_hConn)
    
    
    		; Verzeichnisliste vom Server holen
    		_GetFTP_List()
    		If @error Then Exit 4 + _PrintDebugMessage('_GetFTP_List')
    
    
    		; Existierende Datei auf Server hochladen.
    		Local $sFile = FileOpenDialog('Datei zum hochladen suchen...', @DesktopDir, 'All (*.*)', $FD_FILEMUSTEXIST)
    		If $sFile = '' Then Exit 3
    		Local $sStripFile = _WinAPI_PathStripPath($sFile)
    		_FTP_FilePut($g_hConn, $sFile, $sStripFile)
    		If @error Then Exit 5 +	_PrintDebugMessage('_FTP_FilePut')
    
    
    		; Verzeichnisliste vom Server holen
    		_GetFTP_List()
    		If @error Then Exit 6 +	_PrintDebugMessage('_GetFTP_List')
    
    
    		; Nicht existierende Datei auf Server hochladen. ;-)
    		Local $iRet = _FTP_FilePut($g_hConn, $sFile & '.missing', $sStripFile)
    		If @error Then
    			_PrintDebugMessage('_FTP_FilePut')
    ;~ 			Exit 7
    		EndIf
    
    
    		; Existierende Datei auf Server hochladen - allerdings in ein Verzeichnis, dass es nicht gibt.
    		_FTP_FilePut($g_hConn, $sFile, $sFTP_ChangeDir & '/This Dir is missing/' & $sStripFile)
    		If @error Then Exit 8 + _PrintDebugMessage('_FTP_FilePut')
    
    
    		; Hier kommst du nicht an...
    		_GetFTP_List()
    		If @error Then
    			_PrintDebugMessage('_GetFTP_List')
    ;~ 			Exit 9
    		EndIf
    	EndIf
    
    
    	Exit 0
    EndFunc   ;==>_Main
    
    
    Func _CheckURLs()
    	Local $HURL = 'http://' & $g_sServer
    	Local $FURL = 'ftp://' & $g_sServer
    	Local $SURL = 'ftps://' & $g_sServer
    	_DebugOut($sSpacer & _
    		'$HURL = ' & ((_INetGetSource($HURL, True) = "") ? 'False' : 'True') & @CRLF & _	; True
    		'$FURL = ' & ((_INetGetSource($FURL, True) = "") ? 'False' : 'True') & @CRLF & _	; False
    		'$SURL = ' & ((_INetGetSource($SURL, True) = "") ? 'False' : 'True') & _		; True
    		$sSpacer)
    EndFunc   ;==>_CheckURLs
    
    
    Func _GetFTP_List()
    	$aFTP_DirList = _FTP_ListToArrayEx($g_hConn, 1)
    	If $aFTP_DirList[0][0] = 0 Then Return SetError(1)
    
    
    	$aFTP_FileList = _FTP_ListToArrayEx($g_hConn, 2)
    	ConsoleWrite(StringFormat('+ %-26s      |%-26s|%-26s|%-26s|%-26s|%-26s\n', 'Filename', 'Filesize', 'FileAttribute', 'File Modification datetime', 'File Creation datetime', 'File Access datetime'))
    	For $i = 1 To $aFTP_DirList[0][0] Step 1
    		ConsoleWrite(StringFormat('> %-26s [DIR]|%-26s|%-26s|%-26s|%-26s|%-26s\n', $aFTP_DirList[$i][0], $aFTP_DirList[$i][1], $aFTP_DirList[$i][2], $aFTP_DirList[$i][3], $aFTP_DirList[$i][4], $aFTP_DirList[$i][5]))
    	Next
    	For $i = 1 To $aFTP_FileList[0][0] Step 1
    		ConsoleWrite(StringFormat('- %-26s[FILE]|%-26s|%-26s|%-26s|%-26s|%-26s\n', $aFTP_FileList[$i][0], $aFTP_FileList[$i][1], $aFTP_FileList[$i][2], $aFTP_FileList[$i][3], $aFTP_FileList[$i][4], $aFTP_FileList[$i][5]))
    	Next
    	ConsoleWrite(@CRLF)
    
    
    	_ArrayConcatenate($aFTP_DirList, $aFTP_FileList)
    
    
    	Return $aFTP_DirList
    EndFunc   ;==>_GetFTP_List
    
    
    Func _OpenDebugWin()
    	Local $aWinPos = WinGetPos('[ACTIVE]')
    
    
    	Local $sDebugWinTitle = StringTrimRight(@ScriptName, StringLen(".exe")) & ' ' & @UserName & '@' & $g_sServer
    	_DebugSetup($sDebugWinTitle, True)
    
    
    	Local $hDBWin = WinGetHandle('[TITLE:' & $sDebugWinTitle & ']')
    	Local $aDBWinPos = WinGetPos($hDBWin)
    	Local $idDBEdit1 = _WinAPI_GetDlgCtrlID(ControlGetHandle($hDBWin, '', '[CLASS:Edit; INSTANCE:1]'))
    	GUICtrlSetColor($idDBEdit1, 0xFF1493)
    	GUICtrlSetBkColor($idDBEdit1, 0x43144F)
    	GUICtrlSetFont($idDBEdit1, 10, 600, 0, 'Courier New')
    	Local $x = ($aWinPos[0] + $aWinPos[2]) - ($aDBWinPos[2] + 185)
    	Local $y = $aWinPos[1] + 30
    	WinMove($hDBWin, '', $x, $y, $aDBWinPos[2] +150, $aDBWinPos[3] + 100, 5)
    EndFunc   ;==>_OpenDebugWin
    
    
    Func FTPStatusCallbackHandler($hInternet, $iContext, $iInternetStatus, $pStatusInformation, $iStatusInformationLength)
    	#forceref $hInternet, $iContext
    	If $iInternetStatus = $INTERNET_STATUS_REQUEST_SENT Or $iInternetStatus = $INTERNET_STATUS_RESPONSE_RECEIVED Then
    		Local $iBytesRead
    		Local $tStatus = DllStructCreate('dword')
    		_WinAPI_ReadProcessMemory(_WinAPI_GetCurrentProcess(), $pStatusInformation, $tStatus, $iStatusInformationLength, $iBytesRead)
    		_DebugOut(_FTP_DecodeInternetStatus($iInternetStatus) & ' | Size = ' & DllStructGetData($tStatus, 1) & ' Bytes    Bytes read = ' & $iBytesRead)
    	Else
    		_DebugOut(_FTP_DecodeInternetStatus($iInternetStatus))
    	EndIf
    EndFunc   ;==>FTPStatusCallbackHandler
    
    
    Func _PrintDebugMessage($sFTP_Func, $iError = @error, $iExtended = @extended, $sLine = @ScriptLineNumber)
    	Local $sMessage = ""
    	_FTP_GetLastResponseInfo($iError, $sMessage)
    	_DebugOut($sSpacer & _
    		"FUNCTION FAILED   --> " & $sFTP_Func  & @CRLF & _
    		"ScriptLineNumber  --> " & $sLine & @CRLF & _
    		"@error            --> " & $iError & @CRLF & _
    		"@extended         --> " & $iExtended & @CRLF & _
    		$sMessage & _
    		$sSpacer)
    EndFunc  ;==>_PrintDebugMessage
    
    
    Func _Exit()
    	TCPShutdown()
    	_FTP_Close($g_hConn)
    	_FTP_Close($g_hOpen)
    EndFunc   ;==>_Exit
    Alles anzeigen

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™