Framework/Abstracts/FileOutputBase.ps1

Set-StrictMode -Version Latest 
class FileOutputBase: ListenerBase
{
    static [string] $ETCFolderPath = "Etc";

    [string] $FilePath = "";
    [string] $FolderPath = "";
    [string] $BasePath = "";
    
    FileOutputBase()
    {   
        [Helpers]::AbstractClass($this, [FileOutputBase]);
    }     

    [string] CalculateFolderPath([SubscriptionContext] $context, [string] $subFolderPath)
    {
        $outputPath = "";
        if($context -and (-not [string]::IsNullOrWhiteSpace($context.SubscriptionName)) -and (-not [string]::IsNullOrWhiteSpace($context.SubscriptionId)))
        {
            $isDefaultPath = $false;
            if([System.String]::IsNullOrEmpty($this.BasePath))
            {
                $isDefaultPath = $true;
                $this.BasePath = [Constants]::AzSdkLogFolderPath;
            }

            if (-not $this.BasePath.EndsWith("\")) {
                $this.BasePath += "\";
            }

            $outputPath = $this.BasePath + "AzSDKLogs\"

            $sanitizedPath = [Helpers]::SanitizeFolderName($context.SubscriptionName);
            if ([string]::IsNullOrEmpty($sanitizedPath)) {
                $sanitizedPath = $context.SubscriptionId;
            }

            $runPath = $this.RunIdentifier;
            $commandMetadata = $this.GetCommandMetadata();

            if($commandMetadata)
            {
                $runPath += "_" + $commandMetadata.ShortName;
            }

            if ([string]::IsNullOrEmpty($sanitizedPath)) {
                $outputPath += ("Default\{0}\" -f $runPath);            
            }
            else {
                $outputPath += ("Sub_{0}\{1}\" -f $sanitizedPath, $runPath);            
            }

            if (-not [string]::IsNullOrEmpty($subFolderPath)) {
                $sanitizedPath = [Helpers]::SanitizeFolderName($subFolderPath);
                if (-not [string]::IsNullOrEmpty($sanitizedPath)) {
                    $outputPath += ("{0}\" -f $sanitizedPath);            
                }   
            }

            if(-not (Test-Path $outputPath))
            {
                try
                {
                    mkdir -Path $outputPath -ErrorAction Stop | Out-Null
                }
                catch
                {
                    $outputPath = "";
                    if(-not $isDefaultPath)
                    {
                        $this.BasePath = "";
                        $outputPath = $this.CalculateFolderPath($context, $subFolderPath);
                    }
                }
            }
        }
        return $outputPath;
    }

    [string] CalculateFolderPath([SubscriptionContext] $context)
    {
        return $this.CalculateFolderPath($context, "");
    }

    [void] SetFolderPath([SubscriptionContext] $context)
    {
        $this.SetFolderPath($context, "");
    }

    [void] SetFolderPath([SubscriptionContext] $context, [string] $subFolderPath)
    {
        $this.FolderPath = $this.CalculateFolderPath($context, $subFolderPath);
    }

    [string] CalculateFilePath([SubscriptionContext] $context, [string] $fileName)
    {
        return $this.CalculateFilePath($context, "", $fileName);
    }

    [string] CalculateFilePath([SubscriptionContext] $context, [string] $subFolderPath, [string] $fileName)
    {
        $outputPath = "";
        $this.SetFolderPath($context, $subFolderPath); 
        if ([string]::IsNullOrEmpty($this.FolderPath)) {
            return $outputPath;
        }

        $outputPath = $this.FolderPath;
        if (-not $outputPath.EndsWith("\")) {
            $outputPath += "\";
        }
        if ([string]::IsNullOrEmpty($fileName)) {
            $outputPath += $(Get-Date -format "yyyyMMdd_HHmmss") + ".log";
        }
        else {
            $outputPath += $fileName;            
        }
        return $outputPath;
    }

    [void] SetFilePath([SubscriptionContext] $context, [string] $fileName)
    {
        $this.SetFilePath($context, "", $fileName);
    }

    [void] SetFilePath([SubscriptionContext] $context, [string] $subFolderPath, [string] $fileName)
    {
        $this.FilePath = $this.CalculateFilePath($context, $subFolderPath, $fileName);
    }
}