<# .SYNOPSIS Provide a brief description of script purpose .DESCRIPTION Provide a more detailed description of script purpose .EXAMPLE Provide an example usage for the script .NOTES NAME: AUTHOR: LASTEDIT: VERSION: #> #region Parameters param ( # Allows modules required by the script to be predefined, and loaded or installed as needed [Parameter(DontShow = $true)] [Array] $ModuleNames = @(), # Sets the script storage directory into the user profile instead of in the ProgramData folder [Parameter(Mandatory = $false)] [Switch] $UserScript = $false, # Allows for the script logs to output to a nonstandard location. Overrides user/computer script paths [Parameter(Mandatory = $false)] [String] $LogDir, # Flag to disable log file output [Parameter(Mandatory = $false)] [Switch] $NoLog, # Allows for uninstallation of script [Parameter(Mandatory = $false)] [Switch] $Uninstall #TODO: Add additional parameters, if appropriate ) #endregion Parameters #region Architecture Check # Verifies script is running in 64-bit PowerShell, if available. Allows for parameters to be passed to relaunched script # Origin: https://z-nerd.com/blog/2020/03/31-intune-win32-apps-powershell-script-installer/ If ($Env:PROCESSOR_ARCHITECTURE -ne "AMD64") { If (Test-Path -Path "$Env:WinDir\SysNative\WindowsPowerShell\v1.0\powershell.exe" -PathType Leaf) { $ArgsString = "" Try { ForEach ($Key in $MyInvocation.BoundParameters.Keys) { Switch ($MyInvocation.BoundParameters[$Key].GetType().Name) { "SwitchParameter" { if ($MyInvocation.BoundParameters[$Key].IsPresent) { $ArgsString += "-$Key " } } "String" { $ArgsString += "-$Key `"$($MyInvocation.BoundParameters[$Key])`" " } "Int32" { $ArgsString += "-$Key $($MyInvocation.BoundParameters[$Key]) " } "Boolean" { $ArgsString += "-$Key `$$($MyInvocation.BoundParameters[$Key]) " } } } Start-Process -FilePath "$ENV:WINDIR\SysNative\WindowsPowershell\v1.0\PowerShell.exe" -ArgumentList ` "-ExecutionPolicy Bypass -NoProfile -File $PSCommandPath $ArgsString" -Wait -NoNewWindow } Catch { Throw "Failed to start `"$PSCommandPath`" in 64-bit PowerShell" } Exit $LASTEXITCODE } } #endregion Architecture Check #region Imports # Import Test-CommandExists, Add-LogEntry, Add-ListItem, Start-Logging, Import-JSONConfig Invoke-WebRequest "https://gitea.taco.quest/Mindfang/ProjectTools/raw/branch/main/PSUtilities/ScriptTools.ps1" -OutFile "$Env:Temp\ScriptTools.ps1" Import-Module -Name "$Env:Temp\ScriptTools.ps1" -Force #endregion Imports #region Functions #endregion Functions #region Prep # Set the working directory for logs and additional files $ThisScript = ([IO.FileInfo]$MyInvocation.MyCommand.Definition).BaseName If ($UserScript) { $AppDir = "$Env:AppData\Mindfang\$ThisScript" } Else { $AppDir = "$Env:ProgramData\Mindfang\$ThisScript" } # Create specified appdir if it does not already exist If (-Not (Test-Path $AppDir)) { New-Item $AppDir -ItemType Directory } # Begin recording transcript file If (-not $NoLog) { If (-not $LogDir) { $LogDir = $AppDir } Add-LogEntry (Start-Transcript "$AppDir\$ThisScript.log" -Append) } # Load any modules required by script ForEach ($Module in $ModuleNames) { If (-not(Get-Module -ListAvailable -Name $Module)) { Try { Add-LogEntry "Module `"$Module`" not found, installing" Install-Module -Name $Module -Scope CurrentUser -Force -AllowClobber } Catch { Add-LogEntry "Module failed to install automatically! Manaully install the module, then re-run the script." -As Error Exit 1 } } Import-Module $Module } #endregion Prep #region Execution Try { If ( -not $Uninstall) { #TODO: "Install actions" for the script go here } Else { #TODO: "Uninstall actions" for the script go here } } Catch { # Write error to logs, if an exception is caught Write-Output "Script execution failed!" Write-Output $_ Write-Output $_.InvocationInfo Write-Output $_.ScriptStackTrace Exit 1 } Finally { # Stop transcript, even if an error has occurred Stop-Transcript } #endregion Execution