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
Preparare lo script.
Copiare lo script di PowerShell fornito in un
.ps1
file, ad esempio Extract-MSUAndCAB.ps1.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
.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