Trace-ADOCommand.ps1

function Trace-ADOCommand
{
    <#
    .Synopsis
        Traces information about commands run in Azure DevOps
    .Description
        Traces information a command line into the output of Azure DevOps.
    .Example
        Trace-ADOCommand -Command Get-Process -Parameter @{id=$pid}
    .Example
        $myInvocation | Trace-ADOCommand
    .Link
        Write-ADOCommand
    .Link
        https://docs.microsoft.com/en-us/azure/devops/pipelines/scripts/logging-commands
    #>

    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingWriteHost", "", Justification="Directly outputs in certain scenarios")]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("Test-ForUnusableFunction", "", Justification="Directly outputs in certain scenarios")]
    [OutputType([string])]
    param(
    # The command line.
    [Parameter(Mandatory,ParameterSetName='Command',ValueFromPipelineByPropertyName)]
    [Alias('MyCommand','Line')]
    [string]
    $Command,

    # A dictionary of parameters to the command.
    [Parameter(ParameterSetName='Command',ValueFromPipelineByPropertyName)]
    [Alias('Parameters', 'BoundParameters')]
    [Collections.IDictionary]
    $Parameter
    )

    process {
        if ($Command) {
            #region Write Command Message
            $message = (
                '##[command]' + $Command + ' ' + @(
                    if ($Parameter) {
                        foreach ($kv in $Parameter.GetEnumerator()) {
                            '-' + $kv.Key
                            $kv.Value
                        }
                    }
                ) -join ' '
            )

            if ($env:Agent_ID -and $DebugPreference -eq 'SilentlyContinue') {
                Write-Host -Object $message
            } else {
                $message
            }
            #endregion Write Command Message
        }
    }
}