From 0f251715d7f414543be3a2b64fea61ac403263ba Mon Sep 17 00:00:00 2001 From: Marco Blessing Date: Tue, 26 Apr 2022 09:35:14 +0200 Subject: [PATCH] publish PSModuleBase post (#17) --- content/posts/psmodulebase/index.md | 39 ++++++++++++++++------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/content/posts/psmodulebase/index.md b/content/posts/psmodulebase/index.md index dd14edf..890a607 100644 --- a/content/posts/psmodulebase/index.md +++ b/content/posts/psmodulebase/index.md @@ -1,7 +1,7 @@ --- -title: 'PowerShell Module Base for Config Files' +title: 'How to get your PowerShell Module Base root path' date: 2022-03-21T09:14:41+01:00 -draft: true +#draft: true categories: ['PowerShell'] tags: ['ModuleBase', 'config'] @@ -23,17 +23,19 @@ tags: ['ModuleBase', 'config'] ## 🖼️ Intro -Sometimes you want to use a basic config file for your module. This config file should be used to define basic -settings without any user specific content. This file could be placed into your PowerShell Module folder. +This article explains with a practical example how to determine and use the current module base path. + +Sometimes you want to use a basic config file for your module. This config file could be used to define basic +settings for your module. These module wide default settings should placed and shipped within your module. Therefore you can use the automatic variable `$MyInvocation`, especially with its properties `$MyInvocation.MyCommand.Module.ModuleBase`. This returns the full path to your current module base folder, which -can be used to join a path for your config file. +can be used by your function to join a path for your config file. ## 📑 `.\config.psd1` config file Let's assume you start a new module and you need multiple config keys to work with. So you usually create a -json or powershell data based config file: +**JSON** or **P**ower**S**hell **D**ata format based config file: ```powershell { @@ -53,8 +55,8 @@ json or powershell data based config file: ## 🔎 `Get-ConfigValue` helper function -Now you can use `$MyInvocation.MyCommand.Module.ModuleBase` with a helper function to parse the path to your config -file and return your needed values: +Now you can use `$MyInvocation.MyCommand.Module.ModuleBase` with a helper function, to parse the path to your config +file, and return the stored default values: ```powershell function Get-ConfigValue { @@ -62,14 +64,14 @@ function Get-ConfigValue { .SYNOPSIS Returns the value of a given config file key. - .PARAMETER ByKey + .PARAMETER FromKey Config file key. .OUTPUTS [string] .EXAMPLE - Get-ConfigValue -ByKey 'OutputLevel' + Get-ConfigValue -FromKey 'OutputLevel' .NOTES Private module helper function. Used by other function within your module. @@ -79,26 +81,27 @@ function Get-ConfigValue { [OutputType([string])] param ( [Parameter(Mandatory = $true, HelpMessage = 'Existing key from config file.')] - [string]$ByKey + [string]$FromKey ) begin { } process { + $ErrorActionPreference = 'Stop' $ModuleBase = $MyInvocation.MyCommand.Module.ModuleBase $ConfigFile = Join-Path -Path $ModuleBase -ChildPath 'config.psd1' if (Test-Path -Path $ConfigFile) { try { $Config = Import-PowerShellDataFile -Path $ConfigFile - Write-Output $Config.$ByKey + Write-Output $Config.$FromKey } catch { - Write-Error -Message $_.Exception.Message -ErrorAction Stop + Write-Error -Message $_.Exception.Message } } else { - Write-Error -Message 'Config file not found!' -ErrorAction 'Stop' + Write-Error -Message 'Config file not found!' } } @@ -108,12 +111,12 @@ function Get-ConfigValue { ## 💭 Final Thoughts -All you need to to is using the `Get-ConfigValue -ByKey ''` in your functions to get the any value -defined in you config file. +All you need to to is using the `Get-ConfigValue -FromKey ''` in your functions to get any value +defined in your config file. As far as I know, that's the simplest way to get your module root and using it with a config file. {{< alert >}} -Keep in mind not to store any sensitive data in you config file. User specific data should also be stored in a user -context and not in a global module wide config. +Do not to store any sensitive data in you config file. User specific data should also be stored in a user +context and not in a global module wide config file. {{< /alert >}}