Delen via


Scripts: MSU- en .cab-bestanden extraheren

Dit artikel bevat een handleiding voor het gebruik van een PowerShell-script voor het extraheren .msu en .cab opslaan van bestanden in een opgegeven map. Het script is ontworpen voor het afhandelen van verschillende scenario's, zorgt voor soepele extracties en maakt zelfs mappen indien nodig.

Scriptoverzicht

Het script heeft twee verplichte parameters nodig:

  • Het bestandspad van het .msu of .cab bestand
  • Het doelpad waar de uitgepakte bestanden worden opgeslagen

Het script controleert op het bestaan van het opgegeven bestand en de doelmap en maakt de doelmap als deze niet bestaat. Het script gaat vervolgens verder met het extraheren van de inhoud van de .msu of .cab bestanden en verwerkt geneste .cab bestanden in het proces.

Stapsgewijze instructies voor het gebruik van het script

  1. Bereid het script voor.

    Kopieer het opgegeven PowerShell-script naar een .ps1 bestand (bijvoorbeeld Extract-MSUAndCAB.ps1).

  2. Voer het script uit.

    Open PowerShell als beheerder. Ga naar de map waarin uw script is opgeslagen. Voer in dit voorbeeld het script uit door het script uit te voeren .\Extract-MSUAndCAB.ps1.

  3. Geef bestandspaden op.

    Wanneer u hierom wordt gevraagd, geeft u de paden op naar de .msu bestanden die .cab u wilt extraheren. Geef het doelpad op waar de uitgepakte bestanden moeten worden opgeslagen.

Hier volgt een gebruiksvoorbeeld:

powershell -ExecutionPolicy Bypass -File .\Extract-MSUAndCAB.ps1 -filePath "C:\<path>\<yourfile>.msu" -destinationPath "C:\<path>\<destination>"

Belangrijk

Dit voorbeeldscript wordt niet ondersteund in een standaardondersteuningsprogramma of -service van Microsoft.

Het voorbeeldscript wordt geleverd ALS IS zonder enige garantie. Microsoft wijst alle impliciete garanties, met inbegrip van, zonder beperking, impliciete garanties van verkoopbaarheid of geschiktheid voor een bepaald doel af.

Het volledige risico dat het gevolg is van het gebruik of de prestaties van de voorbeeldscripts en documentatie blijft bij u. In geen geval is Microsoft, haar auteurs of iemand anders die betrokken is bij het maken, produceren of leveren van de scripts aansprakelijk voor enige schade (met inbegrip van, zonder beperking, schade voor verlies van bedrijfswinsten, bedrijfsonderbreking, verlies van bedrijfsgegevens of ander geldelijk verlies) dat voortvloeit uit het gebruik van of onvermogen om de voorbeeldscripts of documentatie te gebruiken, zelfs als Microsoft op de hoogte is gesteld van de mogelijkheid van dergelijke schade.

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