スクリプト: .msu ファイルと .cab ファイルを抽出する
この記事では、PowerShell スクリプトを使用して、指定したディレクトリに .msu
ファイルと .cab
ファイルを抽出する方法について説明します。 このスクリプトは、さまざまなシナリオを処理し、スムーズな抽出を保証し、必要に応じてディレクトリを作成するように設計されています。
スクリプトの概要
スクリプトには、次の 2 つの必須パラメーターが必要です。
.msu
または.cab
ファイルのファイル パス- 抽出されたファイルが格納される宛先パス
スクリプトは、指定されたファイルと宛先ディレクトリの存在を確認し、存在しない場合はコピー先ディレクトリを作成します。 その後、スクリプトは .msu
または .cab
ファイルの内容の抽出に進み、プロセス内の入れ子になった .cab
ファイルを処理します。
スクリプトを使用するための詳細な手順
スクリプトを準備します。
指定した PowerShell スクリプトを
.ps1
ファイルにコピーします (例: Extract-MSUAndCAB.ps1)。スクリプトを実行します。
PowerShell を管理者として開きます。 スクリプトが保存されているディレクトリに移動します。 この例では、
.\Extract-MSUAndCAB.ps1
を実行してスクリプトを実行します。ファイル パスを指定します。
メッセージが表示されたら、抽出する
.msu
または.cab
ファイルへのパスを指定します。 抽出したファイルを保存する宛先パスを指定します。
使用例を次に示します。
powershell -ExecutionPolicy Bypass -File .\Extract-MSUAndCAB.ps1 -filePath "C:\<path>\<yourfile>.msu" -destinationPath "C:\<path>\<destination>"
重要
このサンプル スクリプトは、Microsoft 標準サポート プログラムまたはサービスではサポートされていません。
サンプル スクリプトは、いかなる種類の保証もなく、現状のまま提供されます。 Microsoft は、商品性または特定の目的への適合性に関する黙示の保証を含むが、これらに限定されない、すべての黙示的保証を一切放棄します。
サンプル スクリプトとドキュメントの使用またはパフォーマンスから生じるリスク全体は、引き続きご利用ください。 スクリプトの作成、制作、または配信に関与する Microsoft、その作成者、または他の誰かが、サンプル スクリプトまたはドキュメントの使用または使用不能から生じたいかなる損害 (事業利益の損失、事業中断、ビジネスの中断、ビジネス情報の損失、またはその他の一切の損失を含むがこれらに限定されない) に対して責任を負うものではありません。 このような損害の可能性について Microsoft から通知を受けた場合でも、
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