Freigeben über


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

  1. Bereiten Sie das Skript vor.

    Kopieren Sie das bereitgestellte PowerShell-Skript in eine .ps1 Datei (z. B . Extract-MSUAndCAB.ps1).

  2. 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.

  3. 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