Partager via


Scripts : extraire des fichiers .msu et .cab

Cet article fournit un guide sur l’utilisation d’un script PowerShell pour extraire et .cab fichiers .msu dans un répertoire spécifié. Le script est conçu pour gérer différents scénarios, garantir des extractions lisses et même créer des répertoires si nécessaire.

Vue d’ensemble du script

Le script a besoin de deux paramètres obligatoires :

  • Chemin d’accès au fichier ou .cab au .msu fichier
  • Chemin d’accès de destination où les fichiers extraits seront stockés

Le script vérifie l’existence du fichier et du répertoire de destination spécifiés et crée le répertoire de destination s’il n’existe pas. Le script procède ensuite à l’extraction du contenu du ou .cab des .msu fichiers et gère les fichiers imbriqués .cab dans le processus.

Instructions pas à pas pour l’utilisation du script

  1. Préparez le script.

    Copiez le script PowerShell fourni dans un .ps1 fichier (par exemple, Extract-MSUAndCAB.ps1).

  2. Exécutez le script.

    Ouvrez PowerShell en tant qu’administrateur. Accédez au répertoire dans lequel votre script est enregistré. Dans cet exemple, exécutez le script en exécutant .\Extract-MSUAndCAB.ps1.

  3. Fournissez des chemins d’accès aux fichiers.

    Lorsque vous y êtes invité, fournissez les chemins d’accès aux .msu fichiers que .cab vous souhaitez extraire. Spécifiez le chemin d’accès de destination où les fichiers extraits doivent être enregistrés.

Voici un exemple d’utilisation :

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

Important

Cet exemple de script n’est pas pris en charge dans le cadre d’un programme ou d’un service de support standard Microsoft.

L’exemple de script est fourni AS IS sans garantie quelconque. Microsoft exclut en outre toutes les garanties implicites, y compris, sans limitation, toute garantie implicite de marchandabilité ou d’adéquation à un usage particulier.

Tout le risque résultant de l’utilisation ou des performances des exemples de scripts et de la documentation reste avec vous. En aucun cas, Microsoft, ses auteurs ou toute autre personne impliquée dans la création, la production ou la livraison des scripts ne sont responsables de tout dommage que ce soit (y compris, sans limitation, dommages pour perte de bénéfices commerciaux, interruption d’activité, perte d’informations commerciales ou toute autre perte de fonds) résultant de l’utilisation ou de l’incapacité d’utiliser les exemples de scripts ou de documentation, même si Microsoft a été informé de la possibilité de tels dommages.

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