src/Public/Create-TraceFlag.ps1

function Create-TraceFlag {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true)][Alias("o")]$orgAlias,
        [Parameter(Mandatory = $true)][Alias("m")]$duration,
        [Parameter(Mandatory = $false)][Alias("d")]$debuglevel
    )
    
    # Get the user ID
    sf org display user -o $orgAlias --json | ConvertFrom-Json | Tee-Object -variable userOrgResult
    $userOrgResult.result.Id | Tee-Object -variable userId
    
    # Set start and expiration dates
    $startDate = Get-Date -Format "yyyy-MM-ddTHH:mm.sssK"
    $expirationDate = (Get-Date).AddMinutes($duration).ToString("yyyy-MM-ddTHH:mm.sssK")

    # Set default debug level
    if ($debuglevel -eq $null){
        $debuglevel = 'SFDC_DevConsole'
    }

    # Get the debug level ID
    sf data query --query "SELECT Id FROM DebugLevel WHERE DeveloperName = '$debuglevel' LIMIT 1" -o $orgAlias -t -r json | ConvertFrom-Json | Tee-Object -variable debugLevelResult
    $debugLevelResult.result.records.Id | Tee-Object -variable debugLevelId

    # Get existing trace flags
    sf data query --query "SELECT Id FROM TraceFlag where TracedEntityID = '$userId' ORDER BY ExpirationDate DESC " -o $orgAlias -t -r json | ConvertFrom-Json | Tee-Object -variable traceFlagResult

    # Create or update the trace flag
    $commonProperties = "DebugLevelId=$debugLevelId StartDate=$startDate ExpirationDate=$expirationDate"

    if ($traceFlagResult.result.totalSize -eq 0) {
        $traceFlagProperties = "$commonProperties LogType=USER_DEBUG TracedEntityId=$userId"
        sf data create record -t --sobject TraceFlag --values $traceFlagProperties
    } else{
        $traceFlagProperties = $commonProperties
        sf data update record -t --sobject TraceFlag --values $traceFlagProperties --record-id $traceFlagResult.result.records[0].Id
    }
}