Code-Beispiel
MSI-Dateien entpacken
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
k. A. | hhr | 22.06.2020 |
Windows Installer-Dateien (*.msi) lassen sich mit
msiexec /a Quelldatei /qn TARGETDIR=Zielordner
entpacken.
Die Anzeigeoption /qn verhindert, dass Informationen angezeigt werden. Für mehr Informationen kann /qn durch /qb ersetzt werden.
Das folgende Programm erzeugt die Zeichenketten für Quelldatei und Zielordner und führt obige Anweisung aus.
Weil manche msiexec-Versionen Leerzeichen im Namen des Zielordners eigenwillig behandeln, werden solche Leerzeichen durch Unterstriche ersetzt.
Im Hauptverzeichnis der Partition, in der sich die zu entpackende MSI-Datei befindet, wird ein Ordner TempMsi angelegt, in dem der Zielordner erzeugt wird.
Ein Symbol für eine Verknüpfung befindet sich in %SystemRoot%\System32\msiexec.exe
Erstellt unter Windows 7 mit FreeBASIC 1.06.0
Quellen:
https://www.batboard.net/index.php/Thread/9899-Wie-kann-man-eine-MSI-Datei-entpacken
https://www.freebasic-portal.de/freebasic-faq/dos-fenster-im-hintergrund-beseitigen-2.html
https://www.freebasic-portal.de/code-beispiele/dateien-laufwerke/dialog-datei-oeffnen-speichern-24.html
https://www.freebasic-portal.de/porticula/messagebox-in-freebasic-683.html
https://www.freebasic-portal.de/code-beispiele/windows-gui/messagebox-17.html
https://docs.microsoft.com/en-us/windows/desktop/api/commdlg/ns-commdlg-tagofna
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-messagebox
https://docs.microsoft.com/en-us/windows/desktop/msi/error-codes
' extractmsi.bas - zu kompilieren mit -s gui (Windows GUI)
Dim As String caption = "ExtractMSI"
Dim As String explorerpath = Environ("windir") & "\explorer.exe"
Dim As String msiexecpath = Environ("windir") & "\System32\msiexec.exe"
' Informationen zu msiexec.exe anzeigen:
'Chain(msiexecpath)
#Include Once "WINDOWS.BI"
#Include Once "win\COMMDLG.BI"
Dim As String strTitle = caption & Space(1) & "-" & Space(1) & "MSI-Datei wählen"
Dim As String strFilter = "Windows Installer-Datei (*.msi)" & Chr(0) & "*.msi" & Chr(0, 0)
Dim As String*MAX_PATH strFile
Dim tagOFN As OPENFILENAME
With tagOFN
.lStructSize = Len(tagOFN)
.lpstrTitle = Strptr(strTitle)
.lpstrFilter = Strptr(strFilter)
.lpstrFile = Strptr(strFile)
.nMaxFile = Len(strFile)
.flags = OFN_HIDEREADONLY Or OFN_FILEMUSTEXIST Or OFN_DONTADDTORECENT
End With
If GetOpenFileName(@tagOFN) Then
Dim As String destdir, argument
' Namen für den Zielordner entnehmen:
destdir = Mid(strFile, Instrrev(strFile, "\"), Instrrev(strFile, ".") - Instrrev(strFile, "\"))
' Nicht erlaubte Zeichen am Ende des Ordnernamens entfernen:
destdir = Rtrim(destdir, Any Space(1) & ".")
' Leerzeichen durch Unterstriche ersetzen:
Dim As Ushort start = Instr(destdir, Space(1))
While start
Mid(destdir, start) = "_"
start = Instr(start + 1, destdir, Space(1))
Wend
' Zielpfad zusammenstellen:
destdir = Left(strFile, 3) & "TempMsi" & destdir
' Freien Namen für das Zielverzeichnis suchen.
' Wenn eine Datei oder ein Ordner dieses Namens vorhanden ist,
' wird eine Nummer an den Namen des zu erzeugenden Ordners gefügt:
Dim As Ushort label = 1
Dim As String tempdir = destdir
While Len(Dir(destdir, &hFF))
label += 1
destdir = tempdir & "_(" & Str(label) & ")"
Wend
' msifile, strFile - Kodierungszeichen anfügen:
Dim As String msifile = Chr(34) & strFile & Chr(34)
' Parameterzeile zusammenstellen:
argument = "/a" & Space(1) & msifile & Space(1) & "/qn" & Space(1) & "TARGETDIR=" & destdir
' Ausführen:
Err = Exec(msiexecpath, argument)
' Auswerten des Rückgabewertes:
Dim As String text = Dir(strFile, &hFF) & !"\n\n"
Dim As Ulong uType
Select Case Err
Case -1
text = "Msiexec.exe konnte nicht gefunden werden:"
text &= !"\n"
text &= msiexecpath
uType = MB_OK Or MB_ICONEXCLAMATION
Case ERROR_SUCCESS ' Value 0
If Len(Dir(destdir, &hFF)) Then
text &= "Die Dateien wurden im Ordner" & Space(1) & destdir & Space(1) & "gespeichert."
text &= !"\n"
text &= "Soll der Ordner geöffnet werden?"
uType = MB_YESNO Or MB_ICONEXCLAMATION
Else
text &= "Dieses Installationspaket kann mit diesem Programm nicht entpackt werden."
text &= !"\n"
text &= "Error value:" & Space(1) & Str(Err)
uType = MB_OK Or MB_ICONEXCLAMATION
End If
Case ERROR_INSTALL_USEREXIT ' Value 1602
text &= "Das Kopieren der Dateien wurde abgebrochen."
uType = MB_OK Or MB_ICONEXCLAMATION
Case ERROR_INSTALL_PACKAGE_INVALID ' Value 1620
text &= "Dieses Installationspaket konnte nicht geöffnet werden."
text &= !"\n"
text &= "Error value:" & Space(1) & Str(Err)
uType = MB_OK Or MB_ICONEXCLAMATION
Case ERROR_INSTALL_PLATFORM_UNSUPPORTED ' Value 1633
text &= "Dieses Installationspaket wird auf dieser Plattform nicht unterstützt."
text &= !"\n"
text &= "Error value:" & Space(1) & Str(Err)
uType = MB_OK Or MB_ICONEXCLAMATION
Case Else
text &= "Es ist ein unbestimmter Fehler aufgetreten."
text &= !"\n"
text &= "Error value:" & Space(1) & Str(Err)
uType = MB_OK Or MB_ICONEXCLAMATION
End Select
If MessageBox(0, text, caption, uType) = IDYES Then
Err = Exec(explorerpath, destdir)
If Err <> 1 Then
text = "Explorer.exe konnte nicht gefunden werden:"
text &= !"\n"
text &= explorerpath
uType = MB_OK Or MB_ICONEXCLAMATION
MessageBox(0, text, caption, uType)
End If
End If
End If
End ' extractmsi.bas
'
Zusätzliche Informationen und Funktionen |
- Das Code-Beispiel wurde am 17.02.2019 von
hhr angelegt.
- Die aktuellste Version wurde am 22.06.2020 von
hhr gespeichert.
|
|