64 lines
2.3 KiB
PowerShell
64 lines
2.3 KiB
PowerShell
|
# This script looks for each archive file in a directory and extracts it into the target directory.
|
||
|
# For example, the file "$InputPath/bin.tar.gz" extracts to "$ExtractPath/bin.tar.gz.extracted/**".
|
||
|
# Uses the "tar" utility added to Windows 10 / Windows 2019 that supports tar.gz and zip.
|
||
|
param(
|
||
|
# Full path to directory where archives are stored.
|
||
|
[Parameter(Mandatory=$true)][string] $InputPath,
|
||
|
# Full path to directory to extract archives into. May be the same as $InputPath.
|
||
|
[Parameter(Mandatory=$true)][string] $ExtractPath
|
||
|
)
|
||
|
|
||
|
$ErrorActionPreference = 'Stop'
|
||
|
Set-StrictMode -Version 2.0
|
||
|
|
||
|
$disableConfigureToolsetImport = $true
|
||
|
|
||
|
try {
|
||
|
# `tools.ps1` checks $ci to perform some actions. Since the SDL
|
||
|
# scripts don't necessarily execute in the same agent that run the
|
||
|
# build.ps1/sh script this variable isn't automatically set.
|
||
|
$ci = $true
|
||
|
. $PSScriptRoot\..\tools.ps1
|
||
|
|
||
|
Measure-Command {
|
||
|
$jobs = @()
|
||
|
|
||
|
# Find archive files for non-Windows and Windows builds.
|
||
|
$archiveFiles = @(
|
||
|
Get-ChildItem (Join-Path $InputPath "*.tar.gz")
|
||
|
Get-ChildItem (Join-Path $InputPath "*.zip")
|
||
|
)
|
||
|
|
||
|
foreach ($targzFile in $archiveFiles) {
|
||
|
$jobs += Start-Job -ScriptBlock {
|
||
|
$file = $using:targzFile
|
||
|
$fileName = [System.IO.Path]::GetFileName($file)
|
||
|
$extractDir = Join-Path $using:ExtractPath "$fileName.extracted"
|
||
|
|
||
|
New-Item $extractDir -ItemType Directory -Force | Out-Null
|
||
|
|
||
|
Write-Host "Extracting '$file' to '$extractDir'..."
|
||
|
|
||
|
# Pipe errors to stdout to prevent PowerShell detecting them and quitting the job early.
|
||
|
# This type of quit skips the catch, so we wouldn't be able to tell which file triggered the
|
||
|
# error. Save output so it can be stored in the exception string along with context.
|
||
|
$output = tar -xf $file -C $extractDir 2>&1
|
||
|
# Handle NZEC manually rather than using Exit-IfNZEC: we are in a background job, so we
|
||
|
# don't have access to the outer scope.
|
||
|
if ($LASTEXITCODE -ne 0) {
|
||
|
throw "Error extracting '$file': non-zero exit code ($LASTEXITCODE). Output: '$output'"
|
||
|
}
|
||
|
|
||
|
Write-Host "Extracted to $extractDir"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Receive-Job $jobs -Wait
|
||
|
}
|
||
|
}
|
||
|
catch {
|
||
|
Write-Host $_
|
||
|
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_
|
||
|
ExitWithExitCode 1
|
||
|
}
|