eng/scripts/CommandInvocation-Helpers.ps1 (60 lines of code) (raw):
#Requires -Version 7.0
Set-StrictMode -Version 3.0
function Set-ConsoleEncoding
{
[CmdletBinding()]
param
(
[string] $Encoding = 'utf-8'
)
$outputEncoding = [System.Text.Encoding]::GetEncoding($Encoding)
[Console]::OutputEncoding = $outputEncoding
[Console]::InputEncoding = $outputEncoding
}
function Invoke-LoggedCommand {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string] $Command,
[ValidateScript({ Test-Path $_ -PathType Container })]
[string] $ExecutePath,
[switch] $GroupOutput,
[switch] $IgnoreExitCode
)
$pipelineBuild = !!$env:TF_BUILD
$startTime = Get-Date
if($pipelineBuild -and $GroupOutput) {
Write-Host "##[group]$Command"
} else {
Write-Host "> $Command"
}
if($ExecutePath) {
Push-Location $ExecutePath
}
try {
Invoke-Expression $Command
$duration = (Get-Date) - $startTime
if($pipelineBuild -and $GroupOutput) {
Write-Host "##[endgroup]"
}
if($IgnoreExitCode) {
Write-Host "Command completed ($duration)`n"
}
elseif($LastExitCode -ne 0)
{
if($pipelineBuild) {
Write-Error "##[error]Command completed with exit code $LastExitCode ($duration): $Command`n"
} else {
Write-Error "Command completed with exit code $LastExitCode ($duration): $Command`n"
}
}
else {
Write-Host "Command completed ($duration)`n"
}
}
finally {
if($ExecutePath) {
Pop-Location
}
}
}