Condividi tramite


Script: estrarre file con estensione msu e .cab

Questo articolo fornisce una guida su come usare uno script di PowerShell per estrarre e .cab file .msu in una directory specificata. Lo script è progettato per gestire vari scenari, garantire estrazioni uniformi e persino creare directory, se necessario.

Panoramica di script

Lo script richiede due parametri obbligatori:

  • Percorso del .msu file o .cab
  • Percorso di destinazione in cui verranno archiviati i file estratti

Lo script verifica l'esistenza della directory di file e di destinazione specificata e crea la directory di destinazione, se non esiste. Lo script procede quindi per estrarre il contenuto dei .msu file o .cab e gestisce i file annidati .cab nel processo.

Istruzioni dettagliate per l'uso dello script

  1. Preparare lo script.

    Copiare lo script di PowerShell fornito in un .ps1 file, ad esempio Extract-MSUAndCAB.ps1.

  2. Eseguire lo script.

    Aprire PowerShell come amministratore. Passare alla directory in cui viene salvato lo script. In questo esempio eseguire lo script eseguendo .\Extract-MSUAndCAB.ps1.

  3. Specificare i percorsi dei file.

    Quando richiesto, specificare i percorsi dei .msu file o .cab da estrarre. Specificare il percorso di destinazione in cui salvare i file estratti.

Ecco un esempio d'uso:

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

Importante

Questo script di esempio non è supportato in alcun programma o servizio di supporto standard Microsoft.

Lo script di esempio viene fornito COSÌ COM'È senza garanzia di alcun tipo. Microsoft dichiara ulteriormente tutte le garanzie implicite, tra cui, senza limitazione, eventuali garanzie implicite di commerciabilità o di idoneità per uno scopo specifico.

L'intero rischio derivante dall'uso o dalle prestazioni degli script di esempio e dalla documentazione rimane all'utente. In nessun caso Microsoft, i suoi autori o altri utenti coinvolti nella creazione, produzione o consegna degli script saranno responsabili di eventuali danni (inclusi, senza limitazioni, danni per perdita di profitti aziendali, interruzione dell'attività, perdita di informazioni aziendali o altre perdite di dati aziendali) derivanti dall'uso o dall'impossibilità di utilizzare gli script di esempio o la documentazione, anche se Microsoft è stata avvisata della possibilità di tali danni.

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