Logging/Start-Logging.ps1
function Start-Logging { [CmdletBinding(SupportsShouldProcess)] param ( # will try to find a log folder in the current or parent folder that we have permission to write to, otherwise will write to the users temporary folder [parameter()] [string] $PreferredFolder = 'log', [parameter(Mandatory)] [string] $ApplicationName, [parameter(Mandatory)] [string] $CommandName, [parameter()] [string[]] # Allows passing in a caller Callstack from another process (e.g. when we call from Invoke-BuildDeploy) $CallStack, [parameter()] [string] $CallStackRootLine, [parameter()] [switch] $NoRemoveLog ) try { if (-not $NoRemoveLog) { Remove-Log -PreferredFolder $PreferredFolder -ApplicationName $ApplicationName } } catch { # our mission is to start-logging, so if we can't cleanup - not the end of the world $_ | Get-Error | Out-String | Write-Warning } # check if we have permissions - otherwise don't log $logPath = (Get-LogPath -PreferredFolder $PreferredFolder -CommandName $CommandName -ApplicationName $ApplicationName) try { $null = Start-Transcript -LiteralPath $logPath -NoClobber -IncludeInvocationHeader # get the original command line being executed so it is at the top of the log if (-not $CallStack) { $CallStack = (Get-PSCallStack | Foreach-Object {$_.InvocationInfo.Line}) } $StackString = [System.Text.StringBuilder]::new() for ($i = -2; # $i -ge $CallStack.Length * -1; # exclude ourselves $i-- ) { $null = $StackString.Append(" > $($CallStack[$i])") } if ($CallStackRootLine) { "EXECUTING ROOT COMMAND LINE : $($CallStackRootLine)" | Write-Host -ForegroundColor DarkBlue } else { "EXECUTING COMMAND LINE $([Environment]::NewLine)$($StackString.ToString())" | Write-Host -ForegroundColor DarkBlue } } catch { Write-Warning "Unable to Start-Transcript for $logPath. $($_.Exception.Message)" } } |