- Offizieller Beitrag
Für kleinere Installationen verwende ich nicht extra ein Installationsskript, sondern nutze die Anwendung selbst dafür. Im Allgemeinen erstellt man ja im selben Ordner, indem die Installation gestartet wird, einen Anwendungsordner. Anschließend soll die aktuell laufende Anwendung aber sich in diesem Anwendungsordner befinden und dort ggf. dann alle weiteren erforderlichen Installationen (INI etc.) ausführen, bzw. ganz normal von dort gestartet werden. Die ursprünglich gestartete (Installations)Datei wird dann nicht mehr benötigt und gelöscht.
Es handelt sich hier nicht um eine _SelfDelete - Variante, sondern eher um ein: SelfCopy-CallCopy-DeleteCaller
Vielleicht habt ihr ja für diese Variante Verwendung.
AutoIt
; ======================================================================== INSTALLATIONSORDNER =====
; dieser Ordner wird als Unterordner im aktuellen Pfad erstellt und das Skript dorthin kopiert
Global $sFolderInstall = '__Mein_Installationsordner__'
; ==================================================================================================
; ======================================================================== PRÜFT AUF PARAMETER =====
; wenn Parameter: das kopierte Skript wird im neuen Ordner gestartet und das Original gelöscht
_CheckCmdLine()
; ==================================================================================================
; ======================================================================== HAUPTSKRIPT =============
MsgBox(0, 'Skript-Kopie', 'Ich bin gestartet')
; ==================================================================================================
#Region - functions
; ==================================================================================================
Func _CheckCmdLine()
If $CmdLine[0] Then
Local $aCmd = StringRegExp($CmdLineRaw, "'(\w+)=([^']+)", 3)
Local $iPID, $sPathCaller
For $i = 0 To UBound($aCmd) -2 Step 2
Switch $aCmd[$i]
Case 'pid'
$iPID = $aCmd[$i+1]
Case 'caller'
$sPathCaller = $aCmd[$i+1]
EndSwitch
Next
; Aufruferskript beenden, wenn es noch laufen sollte
If ProcessExists($iPID) Then ProcessWaitClose($iPID)
; Aufruferskript löschen
FileDelete($sPathCaller)
Else
_Check2Move($sFolderInstall)
EndIf
EndFunc ;==>_CheckCmdLine
Func _Check2Move($sFolderTarget)
; $sFolderTarget = Ordner in dem das Programm sein sollte
; Ordner in dem das Programm ist
Local $sFolderCurrent = _GetFullPathNameDetail('.', 'folder')
; Ordnernamen vergleichen --> wenn ungleich: Zielordner als Unterordner des aktuellen Ordners erstellen,
; Skript dorthin kopieren, starten und das aufrufende Skript beenden und löschen
If $sFolderCurrent <> $sFolderTarget Then
Local $sFullTarget = _GetFullPathNameDetail('.') & '\' & $sFolderTarget
; Ordner erstellen
If Not FileExists($sFullTarget) Then DirCreate($sFullTarget)
; Skript kopieren
Local $sExe = StringTrimLeft(@ScriptFullPath, StringInStr(@ScriptFullPath, '\', 0, -1))
FileCopy(@ScriptFullPath, $sFullTarget & '\' & $sExe)
Local $iPID = (ProcessList($sExe))[1][1]
; kopiertes Skript starten (eigene PID,Pfad übergeben)
Local $sParam = StringFormat(" 'pid=%s' 'caller=%s'", $iPID, @ScriptFullPath)
ShellExecute($sFullTarget & '\' & $sExe, $sParam)
; Skript beenden
Exit
EndIf
EndFunc ;==>_Check2Move
Func _GetFullPathNameDetail($_sFilePath, $_sSelect='full')
Local $aRet = DllCall('kernel32.dll', 'dword', 'GetFullPathNameW', 'wstr', $_sFilePath, 'dword', 4096, 'wstr', '', 'ptr', 0)
If @error Or Not $aRet[0] Then Return SetError(@error, @extended, '')
Switch $_sSelect
Case 'full'
Return $aRet[3]
Case 'drive'
Return StringLeft($aRet[3], 2)
Case 'folder'
If StringLen($aRet[3]) > 3 Then
Return StringTrimLeft($aRet[3], StringInStr($aRet[3], '\', 0, -1))
Else
Return ''
EndIf
EndSwitch
EndFunc ;==>_GetFullPathNameDetail
; ==================================================================================================
#endregion
Alles anzeigen