Public/Initialize-Script.ps1
. "$PSScriptRoot/../Private/Shared-Res.ps1" function Initialize-Script { param( [Parameter(Mandatory = $false)] [string] $Path = (Read-Host -Prompt "Root path where script should be scaffolded (./): ") , [Parameter(Mandatory = $true,HelpMessage = "May only be made up of numbers, letters, and some special characters. Regex that passes: ^[\w\d._-]+$")] [string] [ValidatePattern("^[\w\d._-]+$")] $ScriptName , [Parameter(Mandatory = $false)] [boolean] $ShouldUseAdvLogging = $false ) function Invoke-Scaffold { [CmdletBinding()] param() process { try { if (($null -eq $Path) -or '' -eq $Path) { $Path = "./" } $scriptFilePath = "$Path\$ScriptName.ps1" New-Item "$scriptFilePath" -ItemType File $errorHelper = Get-ErrorHelperContent $startTimeInfo = Get-StartTimeInfo $logWriter = Get-LogWriter $logFolder = @" New-Variable -Name logFolder -Value `$("./logs/`$thisScriptName") -Option ReadOnly,AllScope -Force "@ $logCleaner = "" $logCleanupStep = "" $logingNotes = Get-LoggingNotes if ($ShouldUseAdvLogging) { $logCleaner = Get-LogCleaner $logFolder = @" New-Variable -Name logFolder -Value `$("`$PSScriptRoot/logs/`$thisScriptName") -Option ReadOnly,AllScope -Force "@ $logCleanupStep = Get-LogCleanupStep } $mainFile = @" $logingNotes Set-StrictMode -Version 1 New-Variable -Name preview -Value `$(`$true) -Option ReadOnly,AllScope -Force $startTimeInfo New-Variable -Name logFileName -Value `$("$ScriptName") -Option ReadOnly,AllScope -Force New-Variable -Name summaryFolderName -Value `$("summary") -Option ReadOnly,AllScope -Force New-Variable -Name runFolderName -Value `$("per_run") -Option ReadOnly,AllScope -Force New-Variable -Name thisScriptName -Value `$(`$MyInvocation.MyCommand.Name -replace ".ps1", "") -Option ReadOnly,AllScope -Force $logFolder # Create log directory if it does not exist, does not destroy the folder if it exists already New-Item -ItemType Directory -Force -Path "`$logFolder/`$logDate/`$runFolderName" | Out-Null New-Item -ItemType Directory -Force -Path "`$logFolder/`$logDate/`$summaryFolderName" | Out-Null New-Variable -Name logFile -Value `$("`$logFolder/`$logDate/`$runFolderName/`$(`$logFileName)_`$(`$logTime)_log.txt") -Option ReadOnly,AllScope -Force New-Variable -Name summaryFile -Value `$("`$logFolder/`$logDate/`$summaryFolderName/`$(`$logFileName)_log.txt") -Option ReadOnly,AllScope -Force New-Variable -Name keepLogsForNDays -Value `$(14) -Option ReadOnly,AllScope -Force function Program { return 0 } function Invoke-$ScriptName { [CmdletBinding()] param () `$msg = "Starting process. `$(Get-Date)" Write-Txt -txt `$msg try { Program -ErrorAction Stop } catch { `$errorDetails = Get-ErrorDetail -error `$_ Write-Json -label "Top level issue: " -data `$errorDetails throw `$_ } finally { `$msg = "Finished process. `$(Get-Date)``n" Write-Txt -txt `$msg $logCleanupStep } } $errorHelper $logCleaner $logWriter Invoke-$ScriptName -ErrorAction Stop "@ $mainFile | Out-File -FilePath "$scriptFilePath" -Encoding utf8 $content = Get-Content -Path $scriptFilePath Set-Content -Path $scriptFilePath -Value $content -Encoding utf8 -Passthru -Force } catch { Write-Error $_ } } } Invoke-Scaffold -ErrorAction Stop } |