functions/moduledebug/Set-PSMDModuleDebug.ps1
function Set-PSMDModuleDebug { <# .SYNOPSIS Configures how modules are handled during import of this module. .DESCRIPTION This module allows specifying other modules to import during import of this module. Using the Set-PSMDModuleDebug function it is possible to configure, which module is automatically imported, without having to edit the profile each time. This import occurs at the end of importing this module, thus setting this module in the profile as automatically imported is recommended. .PARAMETER Name The name of the module to configure for automatic import. Needs to be an exact match, the first entry found using "Get-Module -ListAvailable" will be imported. .PARAMETER AutoImport Setting this will cause the module to be automatically imported at the end of importing the PSModuleDevelopment module. Even when set to false, the configuration can still be maintained and the debug mode enabled. .PARAMETER DebugMode Setting this will cause the module to create a global variable named "<ModuleName>_DebugMode" with value $true during import of PSModuleDevelopment. Modules configured to use this variable can determine the intended import mode using this variable. .PARAMETER PreImportAction Any scriptblock that should run before importing the module. Only used when importing modules using the "Invoke-ModuleDebug" funtion, as is used for modules set to auto-import. .PARAMETER PostImportAction Any scriptblock that should run after importing the module. Only used when importing modules using the "Invoke-ModuleDebug" funtion, as his used for modules set to auto-import. .PARAMETER Priority When importing modules in a debugging context, they are imported in the order of their priority. The lower the number, the sooner it is imported. .PARAMETER AllAutoImport Changes all registered modules to automatically import on powershell launch. .PARAMETER NoneAutoImport Changes all registered modules to not automatically import on powershell launch. .PARAMETER Confirm If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. .PARAMETER WhatIf If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. .EXAMPLE PS C:\> Set-PSMDModuleDebug -Name 'cPSNetwork' -AutoImport Configures the module cPSNetwork to automatically import after importing PSModuleDevelopment .EXAMPLE PS C:\> Set-PSMDModuleDebug -Name 'cPSNetwork' -AutoImport -DebugMode Configures the module cPSNetwork to automatically import after importing PSModuleDevelopment using debug mode. .EXAMPLE PS C:\> Set-PSMDModuleDebug -Name 'cPSNetwork' -AutoImport -DebugMode -PreImportAction { Write-Host "Was done before importing" } -PostImportAction { Write-Host "Was done after importing" } Configures the module cPSNetwork to automatically import after importing PSModuleDevelopment using debug mode. - Running a scriptblock before import - Running another scriptblock after import Note: Using Write-Host is generally - but not always - bad practice Note: Verbose output during module import is generally discouraged (doesn't apply to tests of course) #> [Alias('smd')] [CmdletBinding(DefaultParameterSetName = "Name", SupportsShouldProcess = $true)] Param ( [Parameter(Mandatory = $true, Position = 0, ParameterSetName = "Name", ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [Alias('n')] [string] $Name, [Parameter(ParameterSetName = 'Name')] [Alias('ai')] [switch] $AutoImport, [Parameter(ParameterSetName = 'Name')] [Alias('dbg')] [switch] $DebugMode, [Parameter(ParameterSetName = 'Name')] [AllowNull()] [System.Management.Automation.ScriptBlock] $PreImportAction, [Parameter(ParameterSetName = 'Name')] [AllowNull()] [System.Management.Automation.ScriptBlock] $PostImportAction, [Parameter(ParameterSetName = 'Name')] [int] $Priority = 5, [Parameter(Mandatory = $true, ParameterSetName = 'AllImport')] [Alias('aai')] [switch] $AllAutoImport, [Parameter(Mandatory = $true, ParameterSetName = 'NoneImport')] [Alias('nai')] [switch] $NoneAutoImport ) process { #region AllAutoImport if ($AllAutoImport) { $allModules = Import-Clixml (Get-PSFConfigValue -FullName 'PSModuleDevelopment.Debug.ConfigPath') if (Test-PSFShouldProcess -Target ($allModules.Name -join ", ") -Action "Configuring modules to automatically import" -PSCmdlet $PSCmdlet) { foreach ($module in $allModules) { $module.AutoImport = $true } Export-Clixml -InputObject $allModules -Path (Get-PSFConfigValue -FullName 'PSModuleDevelopment.Debug.ConfigPath') } return } #endregion AllAutoImport #region NoneAutoImport if ($NoneAutoImport) { $allModules = Import-Clixml -Path (Get-PSFConfigValue -FullName 'PSModuleDevelopment.Debug.ConfigPath') if (Test-PSFShouldProcess -Target ($allModules.Name -join ", ") -Action "Configuring modules to not automatically import" -PSCmdlet $PSCmdlet) { foreach ($module in $allModules) { $module.AutoImport = $false } Export-Clixml -InputObject $allModules -Path (Get-PSFConfigValue -FullName 'PSModuleDevelopment.Debug.ConfigPath') } return } #endregion NoneAutoImport #region Name # Import all module-configurations $allModules = Import-Clixml -Path (Get-PSFConfigValue -FullName 'PSModuleDevelopment.Debug.ConfigPath') # If a configuration already exists, change only those values that were specified if ($module = $allModules | Where-Object Name -eq $Name) { if (Test-PSFParameterBinding -ParameterName "AutoImport") { $module.AutoImport = $AutoImport.ToBool() } if (Test-PSFParameterBinding -ParameterName "DebugMode") { $module.DebugMode = $DebugMode.ToBool() } if (Test-PSFParameterBinding -ParameterName "PreImportAction") { $module.PreImportAction = $PreImportAction } if (Test-PSFParameterBinding -ParameterName "PostImportAction") { $module.PostImportAction = $PostImportAction } if (Test-PSFParameterBinding -ParameterName "Priority") { $module.Priority = $Priority } } # If no configuration exists yet, create a new one with all parameters as specified else { $module = [pscustomobject]@{ Name = $Name AutoImport = $AutoImport.ToBool() DebugMode = $DebugMode.ToBool() PreImportAction = $PreImportAction PostImportAction = $PostImportAction Priority = $Priority } } # Add new module configuration to all (if any) other previous configurations and export it to config file $newModules = @(($allModules | Where-Object Name -ne $Name), $module) if (Test-PSFShouldProcess -Target $name -Action "Changing debug settings for module" -PSCmdlet $PSCmdlet) { Export-Clixml -InputObject $newModules -Path (Get-PSFConfigValue -FullName 'PSModuleDevelopment.Debug.ConfigPath') } #endregion Name } } |