- Offizieller Beitrag
Hi,
ich hatte grade das Vergnügen über 30 Dateien mit FileInstall einzubinden. Da FileInstall für die Quelldatei keine Variablen oder Macros zuläßt, ist das eine sehr müßige Handarbeit.
Bekanntlich ist Faulheit die größte Motivation - also habe ich mir ein Script erstellt, das die lästige Schreibarbeit übernimmt.
Die Funktion wird aufgerufen mit den Parametern:
- Quellpfad oder ~pfade getrennt durch "|"
- Zielpfad
- Name der zu erstellenden Datei
Der oder die Pfade werden rekursiv ausgelesen. Die Pfadstruktur wird für das Installationsziel mit übernommen. - Hier kann es natürlich noch zu Diskrepanzen kommen wenn die Quellpfade stark von den Zielpfaden abweichen, aber das kann man dann zügig mit 'Suchen und Ersetzen' beheben.
Im Installationsscript enthalten ist:
- eine Fehlerüberprüfung für jede installierte Datei
- alle Vorgänge werden mitgelogt
- eine Progressbar für den Installationsfortschritt wird generiert
EDIT
- Log + Fehlercheck und
- Progressbar
jetzt optional
EDIT2
- Bug bei Verwendung von Macros gefixt
Da hatte ich mir doch glatt was neues 'reingefixt'
OK, nun sollte es aber stimmen.
EDIT3
Nun noch der letzte Schliff:
- Es wird jetzt auch die Verzeichnisstruktur für das Installationsziel automatisch erstellt.
(Natürlich auch in derr GUI eingebunden)
Hinweis: Das ganze jetzt auch in einer GUI zum editieren - siehe hier
Spoiler anzeigen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Funktion _WriteInstall($SOURCEPATHES, $TARGET, $FILENAME[, $S_BAR=-1[, $LOG=-1]])
;
; Beschreibung Erzeugt eine Installationsdatei, mit FileInstall()-Routinen
; für alle Dateien des bzw. der Quellpfade, Optional Install-Log und
; Progressbar für Installationsfortschritt
;
; Parameter $SOURCEPATHES Pfad(e) des/der Quellordner getrennt mit "|"
; als String - keine Macros oder Variablen
; $TARGET Zielordner für Installation,
; Macros und Variablen können verwendet werden
; $FILENAME Name der zu erzeugenden Datei (z.B. 'setup.au3')
; als String - keine Macros oder Variablen
; $S_BAR Statusbar generieren (-1 JA, 0 NEIN) [Optional], Default -1
; $LOG Logdatei und Fehlercheck (-1 JA, 0 NEIN) [Optional], Default -1
;
; Autor BugFix ( [email='bugfix@autoit.de'][/email] )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#include <Array.au3>
#include <file.au3>
Func _WriteInstall($SOURCEPATHES, $TARGET, $FILENAME, $S_BAR=-1, $LOG=-1)
Dim $QUELLPFADE, $aFILES[1], $FH = FileOpen($FILENAME,1), $PERCENT, $DIRECTORIES
$aFILES[0] = 0
If ($S_BAR = -1) And ($LOG = -1) Then
FileWrite($FH, "#include <file.au3>" & @CRLF)
FileWrite($FH, "Dim $fehler = 0" & @CRLF)
FileWrite($FH, 'ProgressOn("Installation", "Installationsfortschritt", "")' & @CRLF)
ElseIf $LOG = -1 Then
FileWrite($FH, "#include <file.au3>" & @CRLF)
ElseIf ($S_BAR = -1) And ($LOG <> -1) Then
FileWrite($FH, 'ProgressOn("Installation", "Installationsfortschritt", "")' & @CRLF)
EndIf
If StringInStr($SOURCEPATHES, "|") Then $QUELLPFADE = StringSplit($SOURCEPATHES, "|")
If IsArray($QUELLPFADE) Then
For $i = 1 To $QUELLPFADE[0]
$var = _GetFileList($QUELLPFADE[$i], "*.*")
For $k = 1 To $var[0]
_ArrayAdd($aFILES, $var[$k])
$aFILES[0] += 1
Next
Next
Else
$var = _GetFileList($SOURCEPATHES, "*.*")
If Not IsArray($var) Then
MsgBox(16, 'Achtung', 'In ' & $SOURCEPATHES & ' sind keine Dateien vorhanden!')
Return 0
EndIf
For $i = 1 To $var[0]
_ArrayAdd($aFILES, $var[$i])
$aFILES[0] += 1
Next
EndIf
Select
Case ($S_BAR = -1) And ($LOG = -1) ; mit Statusbar und Log/Fehlercheck
For $i = 1 To $aFILES[0]
$PERCENT = Round(100/$aFILES[0]*$i)
$DIERECTORIES = StringTrimLeft(StringLeft($aFILES[$i], StringInStr($aFILES[$i],"\",0,-1)-1 ), 2 )
If StringRight($TARGET, 1) = "\" Then $TARGET = StringTrimRight($TARGET, 1)
FileWrite($FH, 'ProgressSet(' & $PERCENT & ', "' & StringRight($aFILES[$i], StringLen($aFILES[$i])- StringInStr($aFILES[$i], "\",0,-1)) & '")' & @CRLF)
If StringInStr($TARGET, "@") Then
FileWrite($FH, 'If Not FileExists(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '") Then' & @CRLF)
FileWrite($FH, @TAB & 'If DirCreate(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '") = 1 Then' & @CRLF)
FileWrite($FH, @TAB & @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '\ = OK")' & @CRLF)
FileWrite($FH, @TAB & 'Else' & @CRLF)
FileWrite($FH, @TAB & @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '\ = Fehler")' & @CRLF)
FileWrite($FH, @TAB & @TAB & '$fehler = 1' & @CRLF)
FileWrite($FH, @TAB & 'EndIf' & @CRLF)
FileWrite($FH, 'EndIf' & @CRLF)
FileWrite($FH, 'If FileInstall("' & $aFILES[$i] & '", ' & $TARGET & ' & ' & '"' & StringTrimLeft($aFILES[$i],2) & '") = 1 Then' & @CRLF)
FileWrite($FH, @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = OK")' & @CRLF)
Else
FileWrite($FH, 'If Not FileExists("' & $TARGET & $DIERECTORIES & '") Then' & @CRLF)
FileWrite($FH, @TAB & 'If DirCreate("' & $TARGET & $DIERECTORIES & '") = 1 Then' & @CRLF)
FileWrite($FH, @TAB & @TAB & '_FileWriteLog("' & $TARGET & $DIERECTORIES & '\ = OK")' & @CRLF)
FileWrite($FH, @TAB & 'Else' & @CRLF)
FileWrite($FH, @TAB & @TAB & '_FileWriteLog("' & $TARGET & $DIERECTORIES & '\ = Fehler")' & @CRLF)
FileWrite($FH, @TAB & @TAB & '$fehler = 1' & @CRLF)
FileWrite($FH, @TAB & 'EndIf' & @CRLF)
FileWrite($FH, 'EndIf' & @CRLF)
FileWrite($FH, 'If FileInstall("' & $aFILES[$i] & '", "' & $TARGET & StringTrimLeft($aFILES[$i],2) & '") = 1 Then' & @CRLF)
FileWrite($FH, @TAB & '_FileWriteLog("' & $TARGET & '\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = OK")' & @CRLF)
EndIf
FileWrite($FH, 'Else' & @CRLF)
If StringInStr($TARGET, "@") Then
FileWrite($FH, @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = Fehler")' & @CRLF)
Else
FileWrite($FH, @TAB & '_FileWriteLog("' & $TARGET & '\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = Fehler")' & @CRLF)
EndIf
FileWrite($FH, @TAB & '$fehler = 1' & @CRLF)
FileWrite($FH, 'EndIf' & @CRLF)
Next
FileWrite($FH, 'If $fehler = 1 Then' & @CRLF)
If StringInStr($TARGET, "@") Then
FileWrite($FH, @TAB & 'ProgressSet( 100, "s. ' & $TARGET & ' & ' & '\Install.log", "Installation fehlerhaft!")' & @CRLF)
Else
FileWrite($FH, @TAB & 'ProgressSet( 100, "s. ' & $TARGET & '\Install.log", "Installation fehlerhaft!")' & @CRLF)
EndIf
FileWrite($FH, 'Else' & @CRLF)
FileWrite($FH, @TAB & 'ProgressSet( 100, "Beendet", "Installation erfolgreich!")' & @CRLF)
FileWrite($FH, 'EndIf' & @CRLF)
FileWrite($FH, 'Sleep(3000)' & @CRLF)
FileWrite($FH, 'ProgressOff()' & @CRLF)
Case ($S_BAR = -1) And ($LOG <> -1) ; mit Statusbar, ohne Log/Fehlercheck
For $i = 1 To $aFILES[0]
$PERCENT = Round(100/$aFILES[0]*$i)
$DIERECTORIES = StringTrimLeft(StringLeft($aFILES[$i], StringInStr($aFILES[$i],"\",0,-1)-1 ), 2 )
If StringRight($TARGET, 1) = "\" Then $TARGET = StringTrimRight($TARGET, 1)
FileWrite($FH, 'ProgressSet(' & $PERCENT & ', "' & StringRight($aFILES[$i], StringLen($aFILES[$i])- StringInStr($aFILES[$i], "\",0,-1)) & '")' & @CRLF)
If StringInStr($TARGET, "@") Then
FileWrite($FH, 'If Not FileExists(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '") Then' & @CRLF)
FileWrite($FH, @TAB & 'DirCreate(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '")' & @CRLF)
FileWrite($FH, 'EndIf' & @CRLF)
FileWrite($FH, 'FileInstall("' & $aFILES[$i] & '", ' & $TARGET & ' & ' & '"' & StringTrimLeft($aFILES[$i],2) & '")' & @CRLF)
Else
FileWrite($FH, 'If Not FileExists("' & $TARGET & $DIERECTORIES & '") Then' & @CRLF)
FileWrite($FH, @TAB & 'DirCreate("' & $TARGET & $DIERECTORIES & '")' & @CRLF)
FileWrite($FH, 'EndIf' & @CRLF)
FileWrite($FH, 'FileInstall("' & $aFILES[$i] & '", "' & $TARGET & StringTrimLeft($aFILES[$i],2) & '")' & @CRLF)
EndIf
Next
FileWrite($FH, 'ProgressSet( 100, "", "Installation abgeschlossen!")' & @CRLF)
FileWrite($FH, 'Sleep(3000)' & @CRLF)
FileWrite($FH, 'ProgressOff()' & @CRLF)
Case ($S_BAR <> -1) And ($LOG = -1) ; ohne Statusbar, mit Log/Fehlercheck
For $i = 1 To $aFILES[0]
$DIERECTORIES = StringTrimLeft(StringLeft($aFILES[$i], StringInStr($aFILES[$i],"\",0,-1)-1 ), 2 )
If StringRight($TARGET, 1) = "\" Then $TARGET = StringTrimRight($TARGET, 1)
If StringInStr($TARGET, "@") Then
FileWrite($FH, 'If Not FileExists(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '") Then' & @CRLF)
FileWrite($FH, @TAB & 'If DirCreate(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '") = 1 Then' & @CRLF)
FileWrite($FH, @TAB & @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '\ = OK")' & @CRLF)
FileWrite($FH, @TAB & 'Else' & @CRLF)
FileWrite($FH, @TAB & @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '\ = Fehler")' & @CRLF)
FileWrite($FH, @TAB & @TAB & '$fehler = 1' & @CRLF)
FileWrite($FH, @TAB & 'EndIf' & @CRLF)
FileWrite($FH, 'EndIf' & @CRLF)
FileWrite($FH, 'If FileInstall("' & $aFILES[$i] & '", ' & $TARGET & ' & ' & '"' & StringTrimLeft($aFILES[$i],2) & '") = 1 Then' & @CRLF)
FileWrite($FH, @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = OK")' & @CRLF)
Else
FileWrite($FH, 'If Not FileExists("' & $TARGET & $DIERECTORIES & '") Then' & @CRLF)
FileWrite($FH, @TAB & 'If DirCreate("' & $TARGET & $DIERECTORIES & '") = 1 Then' & @CRLF)
FileWrite($FH, @TAB & @TAB & '_FileWriteLog("' & $TARGET & $DIERECTORIES & '\ = OK")' & @CRLF)
FileWrite($FH, @TAB & 'Else' & @CRLF)
FileWrite($FH, @TAB & @TAB & '_FileWriteLog("' & $TARGET & $DIERECTORIES & '\ = Fehler")' & @CRLF)
FileWrite($FH, @TAB & @TAB & '$fehler = 1' & @CRLF)
FileWrite($FH, @TAB & 'EndIf' & @CRLF)
FileWrite($FH, 'If FileInstall("' & $aFILES[$i] & '", "' & $TARGET & StringTrimLeft($aFILES[$i],2) & '") = 1 Then' & @CRLF)
FileWrite($FH, @TAB & '_FileWriteLog("' & $TARGET & '\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = OK")' & @CRLF)
EndIf
FileWrite($FH, 'Else' & @CRLF)
If StringInStr($TARGET, "@") Then
FileWrite($FH, @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = Fehler")' & @CRLF)
Else
FileWrite($FH, @TAB & '_FileWriteLog("' & $TARGET & '\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = Fehler")' & @CRLF)
EndIf
FileWrite($FH, @TAB & '$fehler = 1' & @CRLF)
FileWrite($FH, 'EndIf' & @CRLF)
Next
Case ($S_BAR <> -1) And ($LOG <> -1) ; ohne Statusbar, ohne Log/Fehlercheck
For $i = 1 To $aFILES[0]
$DIERECTORIES = StringTrimLeft(StringLeft($aFILES[$i], StringInStr($aFILES[$i],"\",0,-1)-1 ), 2 )
If StringRight($TARGET, 1) = "\" Then $TARGET = StringTrimRight($TARGET, 1)
If StringInStr($TARGET, "@") Then
FileWrite($FH, 'If Not FileExists(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '") Then' & @CRLF)
FileWrite($FH, @TAB & 'DirCreate(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '")' & @CRLF)
FileWrite($FH, 'EndIf' & @CRLF)
FileWrite($FH, 'FileInstall("' & $aFILES[$i] & '", ' & $TARGET & ' & ' & '"' & StringTrimLeft($aFILES[$i],2) & '")' & @CRLF)
Else
FileWrite($FH, 'If Not FileExists("' & $TARGET & $DIERECTORIES & '") Then' & @CRLF)
FileWrite($FH, @TAB & 'DirCreate("' & $TARGET & $DIERECTORIES & '")' & @CRLF)
FileWrite($FH, 'EndIf' & @CRLF)
FileWrite($FH, 'FileInstall("' & $aFILES[$i] & '", "' & $TARGET & StringTrimLeft($aFILES[$i],2) & '")' & @CRLF)
EndIf
Next
EndSelect
FileClose($FH)
EndFunc ;==>_WriteInstall
;********************************************************************************
; AutoIt Version: 3.0
; Language: English
; Platform: Win9x/NT/XP
; Author: jos van der Zande
;
; Find files in directory and subdirectories and return it in an Array, all coded in Autoit3
;
; _GetFileList($DIR, $FILEMASK, 1) ; _GetFileList($DIR, $FILEMASK [, Flag]) Flag GetFile(Default) = 0 , GetDirOnly = 1
;********************************************************************************
;Recursive search for filemask
;********************************************************************************
Func _GetFileList($T_DIR,$T_MASK,$DIR_ONLY=0)
Dim $N_DIRNAMES[200000] ; max number of directories that can be scanned
Local $N_DIRCOUNT = 0
Local $N_FILE
Local $N_SEARCH
Local $N_TFILE
Local $N_OFILE
Local $T_FILENAMES
Local $T_FILECOUNT
Local $T_DIRCOUNT = 1
Local $FILEMASK
; check Filemask \ for empty File-Array by GetDirOnly
If $FILEMASK = "n" Then $FILEMASK = "*.no"
; remove the end \ If specified
If StringRight($T_DIR,1) = "\" Then $T_DIR = StringTrimRight($T_DIR,1)
$N_DIRNAMES[$T_DIRCOUNT] = $T_DIR
; Exit if base dir doesn't exists
If Not FileExists($T_DIR) Then Return 0
; keep on looping until all directories are scanned
While $T_DIRCOUNT > $N_DIRCOUNT
$N_DIRCOUNT = $N_DIRCOUNT + 1
; find all subdirs in this directory and save them in a array
$N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\*.*")
While 1
$N_FILE = FileFindNextFile($N_SEARCH)
If @error Then ExitLoop
; skip these references
If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
$N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
; if Directory than add to the list of directories to be processed
If StringInStr(FileGetAttrib( $N_TFILE ),"D") > 0 Then
$T_DIRCOUNT = $T_DIRCOUNT + 1
$N_DIRNAMES[$T_DIRCOUNT] = $N_TFILE
EndIf
Wend
FileClose($N_SEARCH) ; find all Files that mtach the MASK
$N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\" & $T_MASK )
If $N_SEARCH = -1 Then ContinueLoop
While 1
$N_FILE = FileFindNextFile($N_SEARCH)
If @error Then ExitLoop
; skip these references
If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
$N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
; if Directory than add to the list of directories to be processed
If StringInStr(FileGetAttrib( $N_TFILE ),"D") = 0 Then
$T_FILENAMES = $T_FILENAMES & $N_TFILE & @CR
$T_FILECOUNT = $T_FILECOUNT + 1
;MsgBox(0,'filecount ' & $T_FILECOUNT ,$N_TFILE)
EndIf
Wend
FileClose($N_SEARCH)
Wend
If $DIR_ONLY = 0 Then
$T_FILENAMES = StringTrimRight($T_FILENAMES,1)
$N_OFILE = StringSplit($T_FILENAMES,@CR)
Return( $N_OFILE )
Else
ReDim $N_DIRNAMES[$N_DIRCOUNT+1]
$N_DIRNAMES[0] = $N_DIRCOUNT
Return $N_DIRNAMES
EndIf
EndFunc ;==>_GetFileList