# Import-CustomModule # ---------------------------------------------------------------------------- # This Script contains the "Import-CustomModule" Function, which should be integratet in every Digital Data PS Script. # Please use the internal Variable Section for configurations. # # Returns: - # ---------------------------------------------------------------------------- # Copyright (c) 2024 by Digital Data GmbH # # Digital Data GmbH • Ludwig-Rinn-Strasse 16 • D-35452 Heuchelheim # Tel.: 0641/202360 • E-Mail: info-flow@digitaldata.works # ---------------------------------------------------------------------------- # Creation Date / Author: 17.11.2016 / MK # Version Date / Editor: 09.11.2024 / MK # Version Number: 1.1.0.0 #Requires –Version 4.0 #-----------------------------------------------------------------------------------------------------# ######################################## check for arguments ########################################## #-----------------------------------------------------------------------------------------------------# #-----------------------------------------------------------------------------------------------------# ###################################### add additional assemblys ####################################### #-----------------------------------------------------------------------------------------------------# Add-Type -AssemblyName System.Windows.Forms -ErrorAction Stop Add-Type -AssemblyName PresentationCore -ErrorAction Stop Add-Type -AssemblyName PresentationFramework -ErrorAction Stop #-----------------------------------------------------------------------------------------------------# ############################################ set variables ############################################ #-----------------------------------------------------------------------------------------------------# Set-Variable -Name ScriptName -Value (($MyInvocation.MyCommand.Name) -split "\.")[0].ToString() -Scope Script Set-Variable -Name ScriptPath -Value (Split-Path ($MyInvocation.MyCommand.Path)) -Scope Script Set-Variable -Name Counter -Value $NULL -Scope Script Set-Variable -Name ModuleOverrideSourcePath -Value $NULL -Scope Script Set-Variable -Name ModuleDefaultSourcePath -Value $NULL -Scope Script Set-Variable -Name ModuleHKLMRegistryPath -Value "HKLM:\SOFTWARE\Digital Data\Modules" -Scope Script Set-Variable -Name ModuleHKCURegistryPath -Value "HKCU:\SOFTWARE\Digital Data\Modules" -Scope Script #-----------------------------------------------------------------------------------------------------# ############################################ set functions ############################################ #-----------------------------------------------------------------------------------------------------# Function Import-CustomModule { <# .SYNOPSIS Function will load external - additional - PowerShell Modules into current PSSession. .DESCRIPTION By working with Modules, this Function is necessary to load external Modul Functions into the current PowerShell Session. In a productive Enviroment it is recommanded to let this Function set the Registry Key in HKLM for the ModuleSourcePath. In develepment and Test Enviroment it is possible, to work with distributed Folders with different Modules. Therefor the Parameter "ModuleOverrideSourcePath" and the preset Variable "ModuleDefaultSourcePath" are made for. After a successful Import of a Module, Function will Return $True, otherwise a $False. .REQUIREMENT General PowerShell V3 .REQUIREMENT Assembly System.Windows.Forms, PresentationCore, PresentationFramework .REQUIREMENT Variables ModuleOverrideSourcePath, ModuleName, Path, Paths, PathTest, FileTest, Result .REQUIREMENT Variables preSet ScriptName, ScriptPath, ModuleDefaultSourcePath (optional) .REQUIREMENT Functions .VERSION 1.2.0.0 / 09.11.2024 .PARAMETER ModuleName Give the Module Name, you want to load into the current PSSession (without File-Extension). .PARAMETER ModuleOverrideSourcePath Optional Parameter. By giving the ModuleOverrideSourcePath, Function will not check other Paths for the Function you want to load. .PARAMETER ModuleFileExtensions Optional Parameter. Give the Module File-Extension (regular: "psm1" or "dll") without a dot ("."), this is just for the checking routine, not the Import itself.')] .PARAMETER Force Optional Parameter. By using the Force Parameter, Module will be unload and reload. .EXAMPLE Import-CustomModule -ModuleName Write-LogFile -ModuleFileExtensions psm1 .EXAMPLE Import-CustomModule -ModuleName Write-LogFile -Force .EXAMPLE Import-CustomModule -ModuleName Write-LogFile -ModuleFileExtensions psm1 -ModuleOverrideSourcePath D:\ScriptFiles\Modules #> Param ( [Parameter(Position=0,Mandatory=$True,ValueFromPipeline=$True,HelpMessage='Give the ModuleName, you want to load into the current PSSession (without File-Extension)')] [ValidateNotNullOrEmpty()] [String]$ModuleName, [Parameter(Position=1,Mandatory=$False,HelpMessage='Optional Parameter. By giving the ModuleOverrideSourcePath, Function will not check other Paths for the Function you want to load.')] [ValidateNotNullOrEmpty()] [String]$ModuleOverrideSourcePath, [Parameter(Position=2,Mandatory=$False,HelpMessage='Optional Parameter. Give the Module File-Extension (regular: "psm1" or "dll") without a dot ("."), this is just for the checking routine, not the Import itself.')] [ValidateSet("psm1","dll")] [Array]$ModuleFileExtensions = @("psm1","dll"), [Parameter(Position=3,Mandatory=$False,HelpMessage='Optional Parameter. By using the Force Parameter, Module will be unload and reload.')] [Switch]$Force ) #end param Process { #Clear Error Variable $error.clear() #Loop for every possible File Extension (eg. psm1 and dll) FOREACH ($ModuleFileExtension in $ModuleFileExtensions) { #If FileExtension was given, remove it! Because otherwise "Import-Module" Function will have trouble importing. $ModuleName = $ModuleName -Replace("\.(\w{3}|\w{4})$","") Write-Host "" Write-Host "DEBUG Info - Import-CustomModule: You want to load Module $ModuleName.$ModuleFileExtension" IF ((([String]::IsNullOrWhiteSpace($ScriptName) -ne $True) -and ([String]::IsNullOrEmpty($ScriptName) -ne $True)) -and (([String]::IsNullOrWhiteSpace($ScriptPath) -ne $True) -and ([String]::IsNullOrEmpty($ScriptPath) -ne $True))) { #Try this if $ModuleOverrideSourcePath was given by calling the function IF ((([String]::IsNullOrWhiteSpace($ModuleOverrideSourcePath)) -ne $True) -and (([String]::IsNullOrEmpty($ModuleOverrideSourcePath)) -ne $True)) { Write-Host "DEBUG Info - Import-CustomModule: Function has been called with 'ModuleOverrideSourcePath' Parameter input!" Write-Host "DEBUG Info - Import-CustomModule: Testing for existence: $ModuleOverrideSourcePath\$ModuleName.$ModuleFileExtension" $FileTest = Test-Path -Path "$ModuleOverrideSourcePath\$ModuleName.$ModuleFileExtension" -PathType Leaf IF ($FileTest -eq $True) { Write-Host "DEBUG Info - Import-CustomModule: $ModuleOverrideSourcePath and ModuleName seems to exist." Write-Host "DEBUG Info - Import-CustomModule: Trying to import Module: $ModuleName.$ModuleFileExtension" Try { $Result = Import-Module $ModuleOverrideSourcePath\$ModuleName -Verbose -DisableNameChecking -Scope Global -Force:$Force -PassThru -ErrorAction SilentlyContinue IF ("$Result" -eq "$ModuleName") { Write-Host "DEBUG Info - Import-CustomModule: Successfully loaded Module: $ModuleName.$ModuleFileExtension" Return $True } ELSE { Write-Error "DEBUG Info - Import-CustomModule: Unsuccessfully loaded Module: $ModuleName.$ModuleFileExtension" Return $False } #end if/else } Catch { Write-Host "DEBUG Info - Import-CustomModule: Error while importing the Module:" Write-Host "DEBUG Info - Import-CustomModule: $ModuleName" Write-Host $Error Return $False } #end try/catch } ELSE { Write-Host "DEBUG Info - Import-CustomModule: ModuleOverrideSourcePath and/or ModuleName seems not to exist." Write-Host "DEBUG Info - Import-CustomModule: Cannot load Module, please check your input!" Return $False } #end if/else } ELSE { #If $ModuleOverrideSourcePath was not given, try to find a matching folder Write-Host "" Write-Host "DEBUG Info - Import-CustomModule: Function has been called without 'ModuleOverrideSourcePath' Parameter input!" Write-Host "DEBUG Info - Import-CustomModule: Trying to find Module Files on some Places of this Computer." #Set dynamic Array for locations Modul Path could be, even for some testing. #The first value of the array is just a dummy and will never be used -but keep it for the array value starting with 0! [System.Collections.ArrayList]$Paths = @() Write-Host "" $Paths.Add("$env:systemroot\") | Out-Null IF (([String]::IsNullOrEmpty($ModuleDefaultSourcePath)) -or ([String]::IsNullOrWhiteSpace($ModuleDefaultSourcePath))) { Write-Host "DEBUG Info - Import-CustomModule: ModuleDefaultSourcePath was not set! That could be a normal behavior in productive enviroment!" } ELSE { Write-Host "DEBUG Info - Import-CustomModule: Possible Path (1): $ModuleDefaultSourcePath" -ErrorAction SilentlyContinue $Paths.Add("$ModuleDefaultSourcePath") | Out-Null } #end if/else IF ([String]::IsNullOrEmpty($ScriptPath) -or ([String]::IsNullOrWhiteSpace($ScriptPath))) { Write-Host "DEBUG Info - Import-CustomModule: ScriptPath is invalid! That is terrifying! How could that be???" } ELSE { Write-Host "DEBUG Info - Import-CustomModule: Possible Path (2): $ScriptPath" -ErrorAction SilentlyContinue $Paths.Add("$ScriptPath") | Out-Null Write-Host "DEBUG Info - Import-CustomModule: Possible Path (3): $($ScriptPath+"\Module")" -ErrorAction SilentlyContinue $Paths.Add("$($ScriptPath+"\Module")") | Out-Null Write-Host "DEBUG Info - Import-CustomModule: Possible Path (4): $($ScriptPath+"\Modules")" -ErrorAction SilentlyContinue $Paths.Add("$($ScriptPath+"\Modules")") | Out-Null } #end if/else IF (([String]::IsNullOrEmpty((Get-Item $ScriptPath).Parent.FullName)) -or ([String]::IsNullOrWhiteSpace((Get-Item $ScriptPath).Parent.FullName))) { Write-Host "DEBUG Info - Import-CustomModule: ScriptPath has no Parent Folders!" } ELSE { Write-Host "DEBUG Info - Import-CustomModule: Possible Path (5): $((Get-Item $ScriptPath).Parent.FullName)" -ErrorAction SilentlyContinue $Paths.Add("$((Get-Item $ScriptPath).Parent.FullName)") | Out-Null Write-Host "DEBUG Info - Import-CustomModule: Possible Path (6): $(((Get-Item $ScriptPath).Parent.FullName)+"\Module")" -ErrorAction SilentlyContinue $Paths.Add("$(((Get-Item $ScriptPath).Parent.FullName)+"\Module")") | Out-Null Write-Host "DEBUG Info - Import-CustomModule: Possible Path (7): $(((Get-Item $ScriptPath).Parent.FullName)+"\Modules")" -ErrorAction SilentlyContinue $Paths.Add("$(((Get-Item $ScriptPath).Parent.FullName)+"\Modules")") | Out-Null } #end if/else IF (([String]::IsNullOrEmpty($((Get-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath))) -or ([String]::IsNullOrWhiteSpace($((Get-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)))) { Write-Host "DEBUG Info - Import-CustomModule: ModuleSourcePath was not set to Windows Registry (HKLM)!" } ELSE { Write-Host "DEBUG Info - Import-CustomModule: Possible Path (8): $((Get-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)" -ErrorAction SilentlyContinue $Paths.Add("$((Get-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)") | Out-Null } #end if/else IF (([String]::IsNullOrEmpty($((Get-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath))) -or ([String]::IsNullOrWhiteSpace($((Get-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)))) { Write-Host "DEBUG Info - Import-CustomModule: ModuleSourcePath was not set to Windows Registry (HKCU)!" } ELSE { Write-Host "DEBUG Info - Import-CustomModule: Possible Path (8): $((Get-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)" -ErrorAction SilentlyContinue $Paths.Add("$((Get-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)") | Out-Null } #end if/else [Int]$Counter = 0 [String]$ModuleSourcePath = $Null #Loop for multiple Pathtests - for each Path, where Module files could be DO { $Counter++ | Out-Null Write-Host "" Write-Host "DEBUG Info - Import-CustomModule: Testing mutiple Paths ( $Counter of"($($Paths.Count)-1)") for existence, now testing:" Write-Host "DEBUG Info - Import-CustomModule: $($Paths[$Counter])" IF ((([String]::IsNullOrWhiteSpace($($Paths[$Counter]))) -ne $True) -and (([String]::IsNullOrEmpty($($Paths[$Counter])) -ne $True))) { $PathTest = (Test-Path $($Paths[$Counter]) -ErrorAction SilentlyContinue) IF ($PathTest -eq $True) { Write-Host "DEBUG Info - Import-CustomModule: Yes, Path seems to exist." Write-Host "DEBUG Info - Import-CustomModule: Lets check, if there are any Module Files, in it." $FileTest = Get-ChildItem -Path $($Paths[$Counter]) -Filter *.$ModuleFileExtension IF ($($FileTest.count) -gt 0) { Write-Host "DEBUG Info - Import-CustomModule: Found $($FileTest.count) $ModuleFileExtension Module Files in Path!" Set-Variable -Name ModuleSourcePath -Value $($Paths[$Counter]) -Scope local } ELSE { Write-Host "DEBUG Info - Import-CustomModule: Found no $ModuleFileExtension Module Files in Path!" } #end if/else } ELSE { Write-Host "DEBUG Info - Import-CustomModule: No, Path seems not to exist." } #end if/else } ELSE { Write-Host "DEBUG Info - Import-CustomModule: Path seems to be invalid!" } #end if/else } #end do UNTIL ($Counter -ge ($($Paths.Count)-1) -or ($ModuleSourcePath -eq $($Paths[$Counter]))) IF ($ModuleSourcePath -eq $($Paths[$Counter])) { $FileTest = (Test-Path -Path $ModuleSourcePath\$ModuleName.$ModuleFileExtension -PathType Leaf -ErrorAction SilentlyContinue) IF ($FileTest -eq $True) { Write-Host "" Write-Host "DEBUG Info - Import-CustomModule: Trying to import Module: $ModuleName.$ModuleFileExtension" Try { $Result = Import-Module $ModuleSourcePath\$ModuleName -Verbose -DisableNameChecking -Scope Global -Force:$Force -PassThru -ErrorAction SilentlyContinue IF ("$Result" -eq "$ModuleName") { Write-Host "DEBUG Info - Import-CustomModule: Successfully loaded Module: $ModuleName.$ModuleFileExtension" Set-Variable -Name ModuleDefaultSourcePath -Value $ModuleSourcePath -Scope Global Return $True } ELSE { Write-Error "DEBUG Info - Import-CustomModule: Unsuccessfully loaded Module: $ModuleName.$ModuleFileExtension" Return $False } #end if/else } Catch { Write-Host "" Write-Host "DEBUG Info - Import-CustomModule: Loading Module: $ModuleName went wrong." Write-Host "DEBUG Info - Import-CustomModule: Exiting Script, because of this error!" Write-Host $Error Return $False exit } #end try/catch } ELSE { Write-Host "" Write-Host "DEBUG Info - Import-CustomModule: Module does not exist!" Write-Host "DEBUG Info - Import-CustomModule: Skipping: $ModuleName.$ModuleFileExtension" } #end if/else } ELSE { Write-Host "" Write-Host "DEBUG Info - Import-CustomModule: Cant locate Module Files automaticlly!" Write-Host "DEBUG Info - Import-CustomModule: Please select Folder in Dialog." #Prepare Folder Browser Dialog, to choose the Directory with the .psm1 Files. $FolderBrowserDialog = New-Object System.Windows.Forms.FolderBrowserDialog $FolderBrowserDialog.Rootfolder = "Desktop" $FolderBrowserDialog.Description = "Please, choose the Folder, where the Module ""$ModuleName.$ModuleFileExtension"" is stored." $FolderBrowserDialog.SelectedPath = "$ScriptPath" $FolderBrowserDialog.ShowNewFolderButton = $True DO { #Now show the Folder Browser, if neccessary in a loop $FolderBrowserDialogShow = $FolderBrowserDialog.ShowDialog() #By pressing the OK Button.. If ($FolderBrowserDialogShow -eq "OK") { #Save selected folder path in the variable $ModuleSourcePath = ($FolderBrowserDialog.SelectedPath) Write-Host "" Write-Host "DEBUG Info - Import-CustomModule: You choose: $ModuleSourcePath" Write-Host "DEBUG Info - Import-CustomModule: ...testing, if Module ""$ModuleName.$ModuleFileExtension"" can be found there." $FileTest = (Test-Path $ModuleSourcePath\$ModuleName.$ModuleFileExtension -PathType Leaf -ErrorAction SilentlyContinue) IF ($FileTest -eq $True) { Write-Host "DEBUG Info - Import-CustomModule: Module seems to exist, in the selected Folder." Write-Host "DEBUG Info - Import-CustomModule: Now trying to load Module: $ModuleName.$ModuleFileExtension" Try { $Result = Import-Module $ModuleSourcePath\$ModuleName -Verbose -DisableNameChecking -Scope Global -Force:$Force -PassThru -ErrorAction SilentlyContinue IF ("$Result" -eq "$ModuleName") { Set-Variable -Name ModuleDefaultSourcePath -Value $ModuleSourcePath -Scope Global $MessageBoxBody = "Module: $ModuleName.$ModuleFileExtension - successsfully loaded into current PSSession!" $MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Import-CustomModule" $MessageBoxButtonType = "OK" $MessageBoxIcon = "Information" $MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) | Out-Null #Set new default path for next foreach loop Set-Variable -Name ModuleDefaultSourcePath -Value $ModuleSourcePath -Scope Global Set-Variable -Name ModuleOverrideSourcePath -Value $ModuleSourcePath -Scope Global Set-Variable -Name ModuleSourcePath -Value $ModuleSourcePath -Scope Global } ELSE { $MessageBoxBody = "Module: $ModuleName.$ModuleFileExtension - cannot load into current PSSession!" $MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Import-CustomModule" $MessageBoxButtonType = "OK" $MessageBoxIcon = "Warning" $MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) | Out-Null } #end If/else } Catch { Write-Host "" Write-Host "DEBUG Info - Import-CustomModule: Loading Module: $ModuleName.$ModuleFileExtension went wrong." Write-Host "DEBUG Info - Import-CustomModule: Exiting Script, because of this error!" Write-Host $Error exit } #end try/catch } ELSE { Write-Host "DEBUG Info - Import-CustomModule: Module seems not to exist, in the selected Folder." Write-Host "DEBUG Info - Import-CustomModule: Please, select another one! ...this Time the right!" $MessageBoxBody = "Module seems not to exist, in the selected Folder! Please, select another one!" $MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Import-CustomModule" $MessageBoxButtonType = "OK" $MessageBoxIcon = "Warning" $MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) | Out-Null } #end if/else } ELSE { #If you didnt pressed the OK Button.. Write-Host "" Write-Host "DEBUG Info - Import-CustomModule: Operation cancelled by user." Write-Host "DEBUG Info - Import-CustomModule: Exiting Script, because of this!" exit } #end if/else } #end do #Variable "$?" is $True when last operation was ok UNTIL ((($FileTest -eq $True) -and ($? -eq $True)) -or ($FolderBrowserDialogShow -eq "Cancel")) IF (([String]::IsNullOrWhiteSpace($ModuleSourcePath) -ne $True) -and ([String]::IsNullOrEmpty($ModuleSourcePath) -ne $True)) { Write-Host "" Write-Host "DEBUG Info - Import-CustomModule: Should ModuleSourcePath written to Windows Registry?" $MessageBoxBody = "Would you like to save the ModulePath to the Windows Registry?" $MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Import-CustomModule" $MessageBoxButtonType = "YesNo" $MessageBoxIcon = "Question" $MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) IF ($MessageBox -eq 'Yes') { $PathTest = (Test-Path -Path "$ModuleHKLMRegistryPath" -ErrorAction SilentlyContinue) $MessageBox = $NULL IF ($PathTest -eq $False) { Write-Host "DEBUG Info - Import-CustomModule: Registry Key seems not to exist." Write-Host "DEBUG Info - Import-CustomModule: Trying to write ModuleSourcepath to HKLM." Try { New-Item -Path "$ModuleHKLMRegistryPath" -Force -ErrorAction Stop | Out-Null New-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -Value $ModuleSourcePath -ErrorAction Stop | Out-Null } Catch { Write-Host $Error $MessageBoxBody = "Could not save ModuleSourcePath to Windows Registry! Check your access rights! To bypass this issue you can write the ModuleSourcePath to User Registry (HKCU). Would you?" $MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Import-CustomModule" $MessageBoxButtonType = "YesNo" $MessageBoxIcon = "Question" $MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) } #end try/catch } ELSEIF ($PathTest -eq $True) { Write-Host "DEBUG Info - Import-CustomModule: Registry Key seems to exist." Write-Host "DEBUG Info - Import-CustomModule: Trying to write ModuleSourcepath to HKLM." Try { Set-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -Value $ModuleSourcePath -ErrorAction Stop | Out-Null } Catch { Write-Host $Error $MessageBoxBody = "Could not save ModuleSourcePath to Windows Registry! Check your access rights! To Bypass Error: Write ModuleSource Path to User Registry (HKCU)?" $MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Import-CustomModule" $MessageBoxButtonType = "YesNo" $MessageBoxIcon = "Question" $MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) } #end try/catch } ELSE { Write-Host "DEBUG Info - Import-CustomModule: Something went wrong, by getting the ModuleSourcePath!" Write-Host "DEBUG Info - Import-CustomModule: Exiting Script, because of this!" exit } #end if/elseif/else #Block for trying to write the ModuleSourcePath to the User Registry, if System Registry failed. IF ($MessageBox -eq 'Yes') { $PathTest = (Test-Path -Path "$ModuleHKCURegistryPath" -ErrorAction SilentlyContinue) $MessageBox = $NULL IF ($PathTest -eq $False) { Write-Host "DEBUG Info - Import-CustomModule: Registry Key seems not to exist." Write-Host "DEBUG Info - Import-CustomModule: Trying to write ModuleSourcepath to HKCU." Try { New-Item -Path "$ModuleHKCURegistryPath" -Force -ErrorAction Stop | Out-Null New-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -Value $ModuleSourcePath -ErrorAction Stop | Out-Null } Catch { Write-Host $Error $MessageBoxBody = "Could not save ModuleSourcePath to Windows Registry! Not even to User Registry! Check your access rights! Exiting now.." $MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Import-CustomModule" $MessageBoxButtonType = "OK" $MessageBoxIcon = "Warning" $MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) exit } #end try/catch } ELSEIF ($PathTest -eq $True) { Write-Host "DEBUG Info - Import-CustomModule: Registry Key seems to exist." Write-Host "DEBUG Info - Import-CustomModule: Trying to write ModuleSourcepath to HKCU." Try { Set-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -Value $ModuleSourcePath -ErrorAction Stop | Out-Null } Catch { Write-Host $Error $MessageBoxBody = "Could not save ModuleSourcePath to Windows Registry! Not even to User Registry! Check your access rights! Exiting now.." $MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Import-CustomModule" $MessageBoxButtonType = "OK" $MessageBoxIcon = "Warning" $MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) exit } #end try/catch } ELSE { Write-Host "DEBUG Info - Import-CustomModule: Something went wrong, by getting the ModuleSourcePath!" Write-Host "DEBUG Info - Import-CustomModule: Exiting Script, because of this!" exit } #end if/elseif/else } #end if } ELSE { Write-Host "DEBUG Info - Import-CustomModule: You choose, not to save the ModuleSourcePath to the Windows Registry!" $MessageBoxBody = "You choose, not to save the ModuleSourcePath to the Windows Registry!" $MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Import-CustomModule" $MessageBoxButtonType = "OK" $MessageBoxIcon = "Warning" $MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) } #end if/else } ELSE { Write-Host "DEBUG Info - Import-CustomModule: Something went wrong, by getting the ModuleSourcePath!" Write-Host "DEBUG Info - Import-CustomModule: Exiting Script, because of this!" exit } #end if/else } #end if/else } #end if/ else } ELSE { Write-Host "" Write-Host "DEBUG Info - Import-CustomModule: Required Variables (ScriptName and ScriptPath) were not set!" Write-Host "DEBUG Info - Import-CustomModule: Module Import is unvailable without this Variables!" } #end if/else } #end foreach } #end process } #end function #-----------------------------------------------------------------------------------------------------# ########################################### preparing part ############################################ #-----------------------------------------------------------------------------------------------------# # Clear Console Content Clear-Host #-----------------------------------------------------------------------------------------------------# ############################################# main part ############################################### #-----------------------------------------------------------------------------------------------------# #Import-CustomModule -ModuleName Start-CMD-withLogging.psm1 #Import-CustomModule -ModuleName DD_LIB_Standards.dll #Import-CustomModule -ModuleName DD_LIB_Standards.dll -ModuleFileExtensions dll #Import-CustomModule -ModuleName Start-CMD -ModuleFileExtensions psm1 -Force #Import-CustomModule -ModuleName Start-CMD -ModuleOverrideSourcePath E:\Benutzerdateien\MCK1\Desktop\Modules2 #Import-CustomModule -ModuleName Start-CMD -ModuleOverrideSourcePath E:\Benutzerdateien\MCK1\Desktop\Modules2 -Force #remove-module -ErrorAction SilentlyContinue ####################################################################################################### #$Items = Get-ChildItem "$ScriptPath" -Filter *.psm1 $Items = ((Get-ChildItem "$ScriptPath" -Filter *.psm1) + (Get-ChildItem "$ScriptPath" -Filter *.dll)) IF ($Items.count -gt 0) { FOREACH ($Item in $Items) { Write-Host "DEBUG Info - Import-CustomModule: Found Module: $Item" } #end foreach $MessageBoxBody = "Found $($Items.count) Modules in Path. Load/reload those?" $MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: main part" $MessageBoxButtonType = "YesNo" $MessageBoxIcon = "Question" $MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) IF ($MessageBox -eq "Yes") { Write-Host "DEBUG Info - Import-CustomModule: Processing operation." #You can use this function in a FOREACH loop or in/with a pipline input $Items | Import-CustomModule -Force #pause } ELSE { Write-Host "DEBUG Info - Import-CustomModule: Operation abort. Exiting..." } #end if/else } ELSE { Write-Host "DEBUG Info - Import-CustomModule: Found no Modules in Path. Exiting now." $MessageBoxBody = "Found no Modules in Path. Exiting now.." $MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: main part" $MessageBoxButtonType = "OK" $MessageBoxIcon = "Warning" $MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) pause } #end if/else #-----------------------------------------------------------------------------------------------------# ########################################### finishing part ############################################ #-----------------------------------------------------------------------------------------------------# Remove-Variable -Name ScriptName -ErrorAction SilentlyContinue Remove-Variable -Name ScriptPath -ErrorAction SilentlyContinue Remove-Variable -Name Counter -ErrorAction SilentlyContinue Remove-Variable -Name ModuleOverrideSourcePath -ErrorAction SilentlyContinue Remove-Variable -Name ModuleDefaultSourcePath -ErrorAction SilentlyContinue Remove-Variable -Name ModuleHKLMRegistryPath -ErrorAction SilentlyContinue Remove-Variable -Name ModuleHKCURegistryPath -ErrorAction SilentlyContinue Remove-Variable -Name Item -ErrorAction SilentlyContinue Remove-Variable -Name Items -ErrorAction SilentlyContinue Remove-Variable -Name MessageBoxBody -ErrorAction SilentlyContinue Remove-Variable -Name MessageBoxTitle -ErrorAction SilentlyContinue Remove-Variable -Name MessageBoxButtonType -ErrorAction SilentlyContinue Remove-Variable -Name MessageBoxIcon -ErrorAction SilentlyContinue Remove-Variable -Name MessageBox -ErrorAction SilentlyContinue $error.clear()