Hi!
habe für Interne Software bei uns ein Tool geschrieben, welches Updates herunterladen und entpacken soll.
Jedoch hängt es unter Windows 2008 R2 x64! Unter 2003 und 2003 x64 funktioniert es ohne Probleme.
_FTP_FindFileFirst($ftpverbinden,'',$dateisuche)
Es scheint an
_FTP_FindFileFirst($ftpverbinden,'',$dateisuche)
[/autoit]zu liegen.
Funktioniert das ganze nicht mehr unter 2008?
Komme da irgendwie nicht weiter.
btw: Falls es ein bischen unübersichtlich ist, tut es mir leid. Bin noch nicht lange in der Materie .
MfG
Daniel
Spoiler anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=*******.ico
#AutoIt3Wrapper_Res_Fileversion=0.0.0.64
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_Language=1031
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]AutoIt Version: 3.3.4.0
Author: Daniel *******
Script Function:
Download der aktuellen Updates für die *******Programme
#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit];~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Benötigte au3 Dateien ins Script binden
#include <Array.au3>
#Include <FTPEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Deklarieren der Variablen/Konstanten
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Global Const $server = '*******' ;FTP server
Global Const $username = '*******' ; FTP Username
Global Const $password = '*******' ; FTP Passwort
Global Const $configinidatei = @ScriptDir & '\config.ini' ;Legt Pfad und Dateinamen für die Konfigurationsdatei fest
Global Const $protokolldatei = @ScriptDir & '\Protokoll.log' ;Legt Pfad und Dateinamen für die Protokolldatei fest
Global Const $programmanzahl = 9 ;Programmanzahl
Global Const $dateianfang[$programmanzahl] = ['*******','*******','*******','*******','*******','*******','*******','*******','*******'] ; Dateianfänge der Updates bis zum Datum
Global Const $dateipfad[$programmanzahl] = ['/*******/','/*******/','/*******/','/*******/','/*******/','/*******/','/*******/','/*******/','/*******/'] ;Pfade der Programme auf dem FTP Server
Global $Checkbox[$programmanzahl]
Global $Input[$programmanzahl]
Global $Button[$programmanzahl]
Global $check[$programmanzahl]
Global $pfad[$programmanzahl]
Global $updatedatum
Global $Kundeneingabe
Global $ftpsession
Global $ftpverbinden
Global $ftpsession2
Global $ftpverbinden2
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Konfigurationsmodus
if $CmdLine[0] = 1 and $cmdline[1] = '/config' Then ;Wird ausgeführt wenn das Programm mit dem Parameter /config gestartet wird
GUICreate('*******Updater', 569, 454, 193, 115)
$Checkbox[0] = GUICtrlCreateCheckbox('**************', 16, 40, 97, 17)
GUICtrlCreateLabel('Installierte Programme', 16, 8, 107, 17)
$Input[0] = GUICtrlCreateInput('C:\DISK\UPDATE\*******', 128, 40, 329, 21)
$Button[0] = GUICtrlCreateButton('Durchsuchen', 472, 40, 75, 25, 0)
GUICtrlCreateLabel('Zielpfad', 128, 8, 42, 17)
$Checkbox[1] = GUICtrlCreateCheckbox('*********************', 16, 72, 97, 17)
$Input[1] = GUICtrlCreateInput('C:\DISK\UPDATE\*******', 128, 72, 329, 21)
$Button[1] = GUICtrlCreateButton('Durchsuchen', 472, 72, 75, 25, 0)
$Checkbox[2] = GUICtrlCreateCheckbox('Terminplaner', 16, 104, 97, 17)
$Input[2] = GUICtrlCreateInput('C:\DISK\UPDATE\Terminplaner', 128, 104, 329, 21)
$Button[2] = GUICtrlCreateButton('Durchsuchen', 472, 104, 75, 25, 0)
$Checkbox[3] = GUICtrlCreateCheckbox('*******', 16, 136, 97, 17)
$Input[3] = GUICtrlCreateInput('C:\DISK\UPDATE\*******', 128, 136, 329, 21)
$Button[3] = GUICtrlCreateButton('Durchsuchen', 472, 136, 75, 25, 0)
$Checkbox[4] = GUICtrlCreateCheckbox('*******', 16, 168, 97, 17)
$Input[4] = GUICtrlCreateInput('C:\DISK\UPDATE\*******', 128, 168, 329, 21)
$Button[4] = GUICtrlCreateButton('Durchsuchen', 472, 168, 75, 25, 0)
$Checkbox[5] = GUICtrlCreateCheckbox('Fibu', 16, 200, 97, 17)
$Input[5] = GUICtrlCreateInput('C:\DISK\UPDATE\Fibu', 128, 200, 329, 21)
$Button[5] = GUICtrlCreateButton('Durchsuchen', 472, 200, 75, 25, 0)
$Checkbox[6] = GUICtrlCreateCheckbox('Lohn', 16, 232, 97, 17)
$Input[6] = GUICtrlCreateInput('C:\DISK\UPDATE\Lohn', 128, 232, 329, 21)
$Button[6] = GUICtrlCreateButton('Durchsuchen', 472, 232, 75, 25, 0)
$Checkbox[7] = GUICtrlCreateCheckbox('*******', 16, 262, 97, 17)
$Input[7] = GUICtrlCreateInput('C:\DISK\UPDATE\*******', 128, 262, 329, 21)
$Button[7] = GUICtrlCreateButton('Durchsuchen', 472, 262, 75, 25, 0)
$Checkbox[8] = GUICtrlCreateCheckbox('*******', 16, 292, 97, 17)
$Input[8] = GUICtrlCreateInput('C:\DISK\UPDATE\*******', 128, 292, 329, 21)
$Button[8] = GUICtrlCreateButton('Durchsuchen', 472, 292, 75, 25, 0)
$Label1 = GUICtrlCreateLabel('Kundenname', 16, 322, 80, 17)
$Kundeneingabe = GUICtrlCreateInput('Kundenname', 128, 322, 329, 21)
$Sichern = GUICtrlCreateButton('Konfiguration sichern', 16, 416, 115, 25, 0)
$Beenden = GUICtrlCreateButton('Beenden', 472, 416, 75, 25, 0)
GUISetState(@SW_SHOW)
_iniread(1)
[/autoit] [autoit][/autoit] [autoit]While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Beenden
Exit
Case $Sichern
_iniwrite()
_iniwritekundenname()
Case $Button[0]
_durchsuchen($input[0])
Case $Button[1]
_durchsuchen($input[1])
Case $Button[2]
_durchsuchen($input[2])
Case $Button[3]
_durchsuchen($input[3])
Case $Button[4]
_durchsuchen($input[4])
Case $Button[5]
_durchsuchen($input[5])
Case $Button[6]
_durchsuchen($input[6])
Case $Button[7]
_durchsuchen($input[7])
Case $Button[8]
_durchsuchen($input[8])
EndSwitch
WEnd
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Downloadmodus
Elseif $CmdLine[0] = 0 Then ;Wird ausgeführt, wenn es keine Parameter gibt
$programmcount = 0
While $programmcount < $programmanzahl ; Durchläuft die Schleife einmal für jedes Programm
_iniread(4)
If $check[$programmcount] = 1 Then
$ftpsession = _FTP_Open('*******') ;Startet die FTP Session
$ftpverbinden = _FTP_Connect($ftpsession, $server, $username, $password) ; Verbindet sich mit dem FTP Server
if @error then
_FileWriteLog($protokolldatei,'ERROR: Überprüfen Sie Ihre Internetverbindung und Ihre FTP-Zugangsdaten!',1)
_FileWriteLog($protokolldatei,'ERROR: Verbindung zum FTP-Server konnte nicht hergestellt werden.',1)
exit
EndIf
_ftpunterordner($dateipfad[$programmcount])
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Aktuelle Updatedatei finden
Global $dateisuche[11]
Global $dateiname[1] = [$dateisuche]
Global $dateiname2[1] = [$dateisuche]
Global $stop=0
Global $count=0
Local $i=1
Global $aktuellstesupdate = 1
Global $datanfang = $dateianfang[$programmcount]
Global $datpfad = $dateipfad[$programmcount]
$dateisuche4 = _FTP_FindFileFirst($ftpverbinden,'',$dateisuche)
if Not @error Then
If StringTrimRight($dateisuche4[10],12) = $datanfang And StringTrimLeft($dateisuche4[10],StringLen($datanfang)+8) = '.exe' Then ; Es wird nach Dateianfang und *.exe gefiltert
$updatedatum = StringTrimRight($dateisuche4[10],4) ; Datum wird aus dem Dateinamen gefiltert
$updatedatum = StringTrimLeft($updatedatum,StringLen($datanfang))
if $aktuellstesupdate < $updatedatum Then ;Aktuelleste Version wird gesucht
$aktuellstesupdate = $updatedatum
EndIf
EndIf
EndIf
While $stop = 0
$dateisuche2 = _FTP_FindFileNext($dateisuche)
if @error Then
ExitLoop
Else
If StringTrimRight($dateisuche2[10],12) = $datanfang And StringTrimLeft($dateisuche2[10],StringLen($datanfang)+8) = '.exe' Then ; Es wird nach Dateianfang und *.exe gefiltert
$updatedatum = StringTrimRight($dateisuche2[10],4) ; Datum wird aus dem Dateinamen gefiltert
$updatedatum = StringTrimLeft($updatedatum,StringLen($datanfang))
if $aktuellstesupdate < $updatedatum Then ;Aktuelleste Version wird gesucht
$aktuellstesupdate = $updatedatum
EndIf
EndIf
EndIf
WEnd
_FTP_FindFileClose($dateisuche)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Vergleich mit der aktuellen Datei und Download der Datei
If Not FileExists ($pfad[$programmcount]) Then
DirCreate($pfad[$programmcount])
EndIf
Global $lokaledatei = $pfad[$programmcount] & '\' & $datanfang & $aktuellstesupdate & '.exe'
if FileExists($lokaledatei) Then
If _FTP_FileGetSize($ftpverbinden, $datanfang & $aktuellstesupdate & '.exe') = FileGetSize($lokaledatei) Then
Else
_downloadandextract()
EndIf
Else
_downloadandextract()
Endif
EndIf
$programmcount = $programmcount +1
_FTP_Close($ftpsession) ; schließt die FTP Session
WEnd ;~~ENDE~~ Durchläuft die Schleife einmal für jedes Programm
EndIf
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;FUNKTIONEN
Func _durchsuchen($input) ;Ruft einen Durchsuchen Dialog auf und kopiert den ausgewählten Pfad in ein Eingabefeld
Local $choosefolder = FileSelectFolder('Zielordner: ','',1)
If Not $choosefolder = '' Then
GUICtrlSetData($Input,$choosefolder)
Endif
EndFunc ; ~~Ende~~ _durchsuchen
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[/autoit] [autoit][/autoit] [autoit]Func _ftpunterordner($unterordner) ;wechselt den Ordner auf dem FTP und schreibt ein Errorlog, falls dieser nicht vorhanden ist
_FTP_DirSetCurrent($ftpverbinden,$unterordner)
If @error then
_FileWriteLog($protokolldatei,'ERROR: Der Ordner ' & $unterordner & ' konnte nicht gefunden werden!',1)
EndIf
EndFunc ; ~~Ende~~ _ftpunterordner
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[/autoit] [autoit][/autoit] [autoit]Func _iniread($set) ;Liest Daten aus der Ini und übernimmt diese im Programm
If FileExists($configinidatei) Then ;Überprüft, ob die config.ini vorhanden ist
$programmcount2 = 0
While $programmcount2 < $programmanzahl
;Pfade
Local $section = $dateipfad[$programmcount2]
Local $readini = IniRead($configinidatei,$section,'Pfad','')
$pfad[$programmcount2] = $readini
;Checkboxen
$check[$programmcount2] = IniRead($configinidatei,$section,'Installationsstatus','')
If $set = 1 Then ; Einstellungen aus der Ini werden übernommen
;Pfade
GUICtrlSetData($Input[$programmcount2],$pfad[$programmcount2])
;Checkboxen
$checkaktuell = IniRead($configinidatei,$section,'Installationsstatus','')
GUICtrlSetState($Checkbox[$programmcount2],$checkaktuell)
EndIf ; ~~Ende~~ Einstellungen aus der Ini werden übernommen
$programmcount2 = $programmcount2 + 1
WEnd
$kunderead = IniRead(@ScriptDir & '/config.ini','Kunde','Kundenname','Kundenname')
GUICtrlSetData($Kundeneingabe,$kunderead)
EndIf ; ~~Ende~~ Überprüft, ob die config.ini vorhanden ist
EndFunc; ~~Ende~~ _iniread
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[/autoit] [autoit][/autoit] [autoit]Func _iniwrite() ;Schreibt die neuen Daten in die Ini
$programmcount2 = 0
While $programmcount2 < $programmanzahl
;Pfade
Local $guiread = GUICtrlRead($Input[$programmcount2])
$pfad[$programmcount2] = $guiread
IniWrite($configinidatei,$dateipfad[$programmcount2],'Pfad',$pfad[$programmcount2])
;Checkboxen
$guiread = GUICtrlRead($Checkbox[$programmcount2])
$check[$programmcount2] = $guiread
IniWrite($configinidatei,$dateipfad[$programmcount2],'Installationsstatus',$check[$programmcount2])
$programmcount2 = $programmcount2 + 1
WEnd
EndFunc ; ~~Ende~~ _iniwritepfade()
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Func _iniwritekundenname() ;Schreibt die neuen Daten in die Ini
$ftpsession2 = _FTP_Open('*******r_FTP_write') ;Startet die FTP Session
$ftpverbinden2 = _FTP_Connect($ftpsession2, $server, $username, $password) ; Verbindet sich mit dem FTP Server
if @error then
_FileWriteLog($protokolldatei,'ERROR: Überprüfen Sie Ihre Internetverbindung und Ihre FTP-Zugangsdaten!',1)
_FileWriteLog($protokolldatei,'ERROR: Verbindung zum FTP-Server konnte nicht hergestellt werden.',1)
exit
EndIf
_FTP_FileGet($ftpverbinden2,'/serverhostingupdates/Updates.ini',@ScriptDir & '/Updates.ini')
IniWriteSection(@ScriptDir & '/Updates.ini',GUICtrlRead($Kundeneingabe),'')
IniWrite(@ScriptDir & '/config.ini','Kunde','Kundenname',GUICtrlRead($Kundeneingabe))
_FTP_FilePut($ftpverbinden2,@ScriptDir & '/Updates.ini','/serverhostingupdates/Updates.ini')
_FTP_Close($ftpsession2)
Sleep(2000)
FileDelete(@ScriptDir & '/Updates.ini')
MsgBox(64,'Information','Konfiguration gesichert')
EndFunc ; ~~Ende~~ _iniwritepfade()
[/autoit] [autoit][/autoit] [autoit];~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[/autoit] [autoit][/autoit] [autoit]Func _downloadandextract()
DirRemove($pfad[$programmcount],1)
DirCreate($pfad[$programmcount])
_FTP_FileGet($ftpverbinden,$datanfang & $aktuellstesupdate & '.exe',$lokaledatei)
if @error Then
_FileWriteLog($protokolldatei, 'ERROR: Download der Datei ' & $datanfang & $aktuellstesupdate & '.exe' & ' ist fehlgeschlagen.' ,1)
Else
_FileWriteLog($protokolldatei, 'Download der Datei ' & $datanfang & $aktuellstesupdate & '.exe' & ' war erfolgreich.' ,1)
EndIf
;EXTRACT
[/autoit] [autoit][/autoit] [autoit]Run(@ScriptDir & '\7za.exe x "' & $lokaledatei & '" -o"' & $pfad[$programmcount] & '\entpackt"')
EndFunc
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~