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
Préparez le script.
Copiez le script PowerShell fourni dans un
.ps1
fichier (par exemple, Extract-MSUAndCAB.ps1).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
.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