Auto.ps1

#Set-StrictMode -Version Latest
#####################################################
# Auto
#####################################################
<#PSScriptInfo
 
.VERSION 0.16
 
.GUID 602bc07e-a621-4738-8c27-0edf4a4cea8e
 
.AUTHOR David Walker, Sitecore Dave, Radical Dave
 
.COMPANYNAME David Walker, Sitecore Dave, Radical Dave
 
.COPYRIGHT David Walker, Sitecore Dave, Radical Dave
 
.TAGS sitecore powershell local install iis solr
 
.LICENSEURI https://github.com/SitecoreDave/SharedSitecore.SitecoreLocal/blob/main/LICENSE
 
.PROJECTURI https://github.com/SitecoreDave/SharedSitecore.SitecoreLocal
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 
 
#>


<#
.SYNOPSIS
Auto All The Things!
 
.DESCRIPTION
PowerShell script that helps you Automate All The Things!
 
.EXAMPLE
PS> Auto 'name'
 
PS> Auto az armtemplate.json
 
.EXAMPLE
PS> Auto 'name' 'template'
 
.EXAMPLE
PS> Auto 'name' 'template' 'd:\repos'
 
.Link
https://github.com/Radical-Dave/Auto
 
.OUTPUTS
    System.String
#>

[CmdletBinding(SupportsShouldProcess=$true)]
Param(
    [Parameter(Mandatory = $false, Position=0)]
    [string] $action = "help",
    [Parameter(Mandatory = $false, Position=1)]
    [string] $data = "",
    [Parameter(Mandatory = $false, Position=2)]
    [string] $path = "",
    [switch] $Force = $false
)
begin {
    $PSScriptName = ($MyInvocation.MyCommand.Name.Replace(".ps1",""))
    $PSScriptVersion = (Test-ScriptFileInfo -Path $MyInvocation.MyCommand.Path | Select-Object -ExpandProperty Version)
    $PSCallingScript = if ($MyInvocation.PSCommandPath) { $MyInvocation.PSCommandPath | Split-Path -Parent } else { $null }
    Write-Verbose "#####################################################"
    Write-Host "# $PSScriptName $($PSScriptVersion):$action $data $path called by:$PSCallingScript" -ForegroundColor White
    
    $StopWatch = New-Object -TypeName System.Diagnostics.Stopwatch
    $StopWatch.Start()

    if (!$path -and $action -ne 'az') {
        if (Test-Path "$PSScriptRoot\$PSScriptName.json") {
            $path = "$PSScriptRoot\$PSScriptName.json"
        } else {
            $profileParent =Split-Path $profile -Parent
            if (Test-Path "$profileParent\$($PSScriptName).json") {
                $path = "$profileParent\$($PSScriptName).json"
            }
        }
    }
    
    Write-Verbose "path:$path"
    #if (!(Test-Path $path)) {
    # throw "ERROR invalid path:$($path)"
    #}

    if ($path) {
        try {
            #$tasks = Get-Content .\auto.json | Out-String | Invoke-Expression
            $config = (Get-Content $path -Raw) | ConvertFrom-Json
            #Write-Host "config:$($config)"
        } catch {
            throw $_
        }
        Write-Verbose "logs:$($config.logs)"
        $tasksNode = $config.psobject.properties["tasks"].value
        #Write-Host "tasksNode:$($tasksNode)"
        $tasks = $tasksNode.PSObject.Properties
        #Write-Host "tasks:$($tasks)"
    }
}
process {
    if ($action -eq 'add' -and $data.IndexOf('=') -gt -1) {
        Write-Host "add task:$data"
        $ds = $data.split('=')
        #if ($config.tasks["$data"]) {
            #if (!Force) {
            # throw "ERROR Task:$action already exists. Use -Force to overwrite."
            #} else {
            # $config.tasks | Add-Member -MemberType NoteProperty -Name "$($ds[0])" -Value "$($ds[1])" -PassThru -Force
            #}
        #} else {
            $config.tasks | Add-Member -MemberType NoteProperty -Name "$($ds[0])" -Value "$($ds[1])" -PassThru -Force
        #}
        $config | ConvertTo-Json | Out-File $path
    } elseif ($action -eq 'del' -or $action -eq 'delete' -and $data) {
        if (!$config -or !$config.tasks) {
            throw 'ERROR no config or config.tasks?'
        }
        Write-Host "delete task:$data"
        $config.tasks.PSObject.Properties.Remove("$data")
        $config | ConvertTo-Json | Out-File $path
    } else {
        $task = @()
        if ($tasks -and $action -ne 'help') {
            $taskProperty = $tasks[$action]
            if ($taskProperty) {
                $task = $taskProperty.value
            }
        }
        if ($task) {
            Write-Verbose "task:$task"
            if ($task -like '*$(data)*') {
                Write-Verbose "data:$data"
                $task = $task.replace('$(data)', "$($data)")
                #$task = $task -replace '$(data)', "$($data)"
            }
            Write-Verbose "task:$task"
            $cmd = $task
            Write-Verbose "cmd:$cmd"
            if ($cmd -like '~\*') {
                $cmd = (Join-Path (Split-Path $profile -Parent) ($task.Remove(0,2)))
            } elseif ($cmd -like '.\*') {
                $cmd = (Join-Path $PSScriptRoot ($task.Remove(0,2)))
            } elseif ($cmd.Substring(0,2) -eq '*\') {
                $name = $cmd.Remove(0,2)
                Write-Host "name:$name"
                $checkPath = $data
                if (!$checkPath) {
                    #$cmd = (Join-Path $PSScriptRoot ($task.Remove(0,2)))
                    $checkPath = "$(Split-Path $path -Parent)\data\tests\nested"
                }                
                
                Write-Host "checkPath:$checkPath"
                $cmd = Get-ChildItem "$checkPath\$name*" -Recurse | Select-Object FullName
                if (!$cmd) {
                    throw "ERROR could not find item $name in $checkPath -Recurse"
                }
            }
            Write-Host "Invoke:$cmd" -ForegroundColor White
            if (!$data) {
                Invoke-Expression -Command $cmd -OutVariable $results
            } else {
                Invoke-Expression -Command "$cmd $data" -OutVariable $results
            }
            Write-Host "RESULTS:$results"
        } else {
            if ($action -ne 'help' -and $action -ne 'az') {
                Write-Host "Task not found in $PSScriptName.json: $action, to add use: -addTask 'AutoScript'" -ForegroundColor White
            }
            if ($action -eq 'az') {
                Write-Host "RUN:$path"

                #todo: finish working with Nick to use set-env (otherwise use set-envs)
                @((Split-Path $profile -Parent),$PSScriptRoot,("$currLocation" -ne "$PSScriptRoot" ? $currLocation : ''),$data