Skripts: Extrahieren von MSU- und .cab-Dateien
Dieser Artikel enthält eine Anleitung zur Verwendung eines PowerShell-Skripts zum Extrahieren und Extrahieren .msu
von .cab
Dateien in ein angegebenes Verzeichnis. Das Skript wurde entwickelt, um verschiedene Szenarien zu verarbeiten, reibungslose Extraktionen sicherzustellen und sogar Verzeichnisse bei Bedarf zu erstellen.
Skriptübersicht
Das Skript benötigt zwei obligatorische Parameter:
- Der Dateipfad der Datei oder
.cab
der.msu
Datei - Der Zielpfad, in dem die extrahierten Dateien gespeichert werden
Das Skript sucht nach dem Vorhandensein des angegebenen Datei- und Zielverzeichnisses und erstellt das Zielverzeichnis, falls es nicht vorhanden ist. Das Skript wird dann fortgesetzt, um den Inhalt der .msu
Dateien zu .cab
extrahieren und geschachtelte .cab
Dateien im Prozess verarbeitet.
Schrittweise Anleitungen für die Verwendung des Skripts
Bereiten Sie das Skript vor.
Kopieren Sie das bereitgestellte PowerShell-Skript in eine
.ps1
Datei (z. B . Extract-MSUAndCAB.ps1).Führen Sie das Skript aus.
Öffnen Sie PowerShell als Administrator. Wechseln Sie zu dem Verzeichnis, in dem Ihr Skript gespeichert wird. Führen Sie in diesem Beispiel das Skript durch Ausführen aus
.\Extract-MSUAndCAB.ps1
.Geben Sie Dateipfade an.
Wenn Sie dazu aufgefordert werden, geben Sie die Pfade zu den Dateien
.cab
an, die.msu
Sie extrahieren möchten. Geben Sie den Zielpfad an, in dem die extrahierten Dateien gespeichert werden sollen.
Im Folgenden finden Sie ein Beispiel zur Verwendung:
powershell -ExecutionPolicy Bypass -File .\Extract-MSUAndCAB.ps1 -filePath "C:\<path>\<yourfile>.msu" -destinationPath "C:\<path>\<destination>"
Wichtig
Dieses Beispielskript wird unter keinem Microsoft-Standardsupportprogramm oder -dienst unterstützt.
Das Beispielskript wird AS IS ohne Jegliche Garantie bereitgestellt. Microsoft lehnt weiterhin alle konkludenten Garantien ab, einschließlich, ohne Einschränkung, jegliche konkludente Gewährleistung der Handelsmöglichkeit oder der Eignung für einen bestimmten Zweck.
Das gesamte Risiko, das sich aus der Verwendung oder Leistung der Beispielskripts und dokumentation ergibt, bleibt bei Ihnen. In keinem Fall haftet Microsoft, seine Autoren oder sonstigen Personen, die an der Erstellung, Produktion oder Lieferung der Skripts beteiligt sind, für jegliche Schäden (einschließlich, ohne Einschränkung, Schäden für Verlust von Geschäftsgewinnen, Geschäftsunterbrechungen, Verlust von Geschäftsinformationen oder anderen unbestimmten Verlusten), die sich aus der Verwendung oder Unfähigkeit ergeben, die Beispielskripts oder Dokumentation zu verwenden, auch wenn Microsoft über die Möglichkeit solcher Schäden informiert wurde.
param (
[Parameter(Mandatory = $true)]
[string]$filePath,
[Parameter(Mandatory = $true)]
[string]$destinationPath
)
# Display the note to the user
Write-Host "==========================="
Write-Host
Write-Host -ForegroundColor Yellow "Note: Do not close any Windows opened by this script until it is completed."
Write-Host
Write-Host "==========================="
Write-Host
# Remove quotes if present
$filePath = $filePath -replace '"', ''
$destinationPath = $destinationPath -replace '"', ''
# Trim trailing backslash if present
$destinationPath = $destinationPath.TrimEnd('\')
if (-not (Test-Path $filePath -PathType Leaf)) {
Write-Host "The specified file does not exist: $filePath"
return
}
if (-not (Test-Path $destinationPath -PathType Container)) {
Write-Host "Creating destination directory: $destinationPath"
New-Item -Path $destinationPath -ItemType Directory | Out-Null
}
$processedFiles = @{}
function Extract-File ($file, $destination) {
Write-Host "Extracting $file to $destination"
Start-Process -FilePath "cmd.exe" -ArgumentList "/c expand.exe `"$file`" -f:* `"$destination`" > nul 2>&1" -Wait -WindowStyle Hidden | Out-Null
$processedFiles[$file] = $true
Write-Host "Extraction completed for $file"
}
function Rename-File ($file) {
if (Test-Path -Path $file) {
$newName = [System.IO.Path]::GetFileNameWithoutExtension($file) + "_" + [System.Guid]::NewGuid().ToString("N") + [System.IO.Path]::GetExtension($file)
$newPath = Join-Path -Path ([System.IO.Path]::GetDirectoryName($file)) -ChildPath $newName
Write-Host "Renaming $file to $newPath"
Rename-Item -Path $file -NewName $newPath
Write-Host "Renamed $file to $newPath"
return $newPath
}
Write-Host "File $file does not exist for renaming"
return $null
}
function Process-CabFiles ($directory) {
while ($true) {
$cabFiles = Get-ChildItem -Path $directory -Filter "*.cab" -File | Where-Object { -not $processedFiles[$_.FullName] -and $_.Name -ne "wsusscan.cab" }
if ($cabFiles.Count -eq 0) {
Write-Host "No more CAB files found in $directory"
break
}
foreach ($cabFile in $cabFiles) {
Write-Host "Processing CAB file $($cabFile.FullName)"
$cabFilePath = Rename-File -file $cabFile.FullName
if ($cabFilePath -ne $null) {
Extract-File -file $cabFilePath -destination $directory
Process-CabFiles -directory $directory
}
}
}
}
try {
# Initial extraction
if ($filePath.EndsWith(".msu")) {
Write-Host "Extracting .msu file to: $destinationPath"
Extract-File -file $filePath -destination $destinationPath
} elseif ($filePath.EndsWith(".cab")) {
Write-Host "Extracting .cab file to: $destinationPath"
Extract-File -file $filePath -destination $destinationPath
} else {
Write-Host "The specified file is not a .msu or .cab file: $filePath"
return
}
# Process all .cab files recursively
Write-Host "Starting to process CAB files in $destinationPath"
Process-CabFiles -directory $destinationPath
}
catch {
Write-Host "An error occurred while extracting the file. Error: $_"
return
}
Write-Host "Extraction completed. Files are located in $destinationPath"
return $destinationPath