JJ_MKVMaker/tool/fetch_7zip.ps1

38 lines
2.3 KiB
PowerShell

# 86: 7-Zip (7z.exe + 7z.dll) 을 third_party\7zip\windows 로 준비한다 (빌드 시 앱의 7zip\ 에 동봉됨).
# 7z · RAR 풀기 (RAR 은 풀기만 - unRAR 라이선스 제한) 와 7z 목록 읽기에 쓴다. ZIP 은 앱 안의 archive 패키지로.
# 공식 배포처 (7-zip.org) 의 MSI 를 받아 SHA-256 을 확인하고, 관리자 설치 (msiexec /a) 로 풀어 필요한 파일만 꺼낸다
# (설치하지 않음 - 시스템을 바꾸지 않는다).
# 라이선스: GNU LGPL 2.1+ (대부분) · unRAR 라이선스 제한 (RAR 풀기 코드) · BSD 3-clause · BSD 2-clause.
# 원문은 License.txt (assets\licenses\7ZIP_LICENSE.txt 와 같음), 소스: https://www.7-zip.org/download.html
# 받은 곳: https://www.7-zip.org/a/7z2501-x64.msi (7-Zip 25.01 x64, 2025-08-03 판) - 2026-10-17 에 받아 SHA-256 을 고정.
# 공식 MSI 는 전자 서명이 없어 해시로만 고정한다 (관리자 승인).
# 사용법: powershell -File tool\fetch_7zip.ps1
$ErrorActionPreference = 'Stop'
$version = '25.01'
$msi = '7z2501-x64.msi'
$sha = 'e7eb0b7ed5efa4e087b7b17f191797f7af5b7f442d1290c66f3a21777005ef57'
$url = "https://www.7-zip.org/a/$msi"
$dest = Join-Path $PSScriptRoot '..\third_party\7zip\windows'
$tmp = Join-Path $env:TEMP 'jj_7zip_fetch'
Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue
New-Item -ItemType Directory -Force $tmp, $dest | Out-Null
$f = Join-Path $tmp $msi
curl.exe -L -s -f -o $f $url
if ($LASTEXITCODE -ne 0) { throw "$msi 을(를) 받지 못했습니다" }
$got = (Get-FileHash $f -Algorithm SHA256).Hash.ToLower()
if ($got -ne $sha) { throw "$msi 의 SHA256 이 다릅니다 ($got)" }
$x = Join-Path $tmp 'x'
Start-Process msiexec.exe -ArgumentList '/a', "`"$f`"", '/qn', "TARGETDIR=`"$x`"" -Wait
$src = Join-Path $x 'Files\7-Zip'
Get-ChildItem $dest | Remove-Item -Force
foreach ($n in '7z.exe', '7z.dll', 'License.txt') {
if (-not (Test-Path (Join-Path $src $n))) { throw "$n 이(가) MSI 에 없습니다" }
Copy-Item (Join-Path $src $n) $dest -Force
}
$ver = (& (Join-Path $dest '7z.exe') i | Select-Object -First 3 | Where-Object { $_ -match '7-Zip' }) -join ''
if ($ver -notmatch [regex]::Escape($version)) { throw "판 번호가 다릅니다: $ver" }
Write-Host $ver
Remove-Item $tmp -Recurse -Force
Write-Host "완료: $dest"