Powershell - Export-ModuleMember doesn't work - powershell

I'm new with PowerShell and I've just started to create my own module.
I created the script & manifest files and placed them into the directory C:\Program Files\WindowsPowerShell\Modules\ who is one listed of the $env:PSModulePath command.
I can import and remove the module as well but it's not recognized as an applet or command when I try to call one of the function.
I use the Import-Module command :
Import-Module MyModule
My script file is something like this :
function MyFunction() {}
Export-ModuleMember -Function *
And my manifest looks like this :
FunctionsToExport = '*'
Do I need to write all of the exported functions into the manifest ?
Thank you for your help.

Ok so after a few hours I found the answer :
ExportedCommand empty custom module PowerShell
You need to put RootModule = 'MyModule.psm1' into the manifest.
Have a nice day !

for me, the following ( based on Mica's answer) worked:
Change the RootModule as Mica suggested in the psd1 file to the psm1 file.
Use the Import-Module -Force MyModule command
(with the '-Force' flag:
"This parameter causes a module to be loaded, or reloaded, over top of the current one." as said at https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/import-module?view=powershell-7.1#examples)

To export everything:
Module manifest (.psd1):
FunctionsToExport = '*'
Module script file (.psm1):
Export-ModuleMember -Function *
To restrict what gets exported:
Module manifest (.psd1):
FunctionsToExport = 'Foo', 'Bar'
Module script file (.psm1):
Export-ModuleMember -Function Foo, Bar
Note that if quotes are not used in this specific way, it will not work, and no error will be reported.

Related

Why is import-module or dot sourcing a file not working in powershell scripts?

I am developing and running PS scripts in VS Code using the PowerShell Extension. I have defined a number of functions in a separate PS module file, which I have saved here:
C:\Users\MyName\Documents\PowerShell\Modules\PowerBiFunctions\PowerBiFunctions.psm1
But when attempting to import the module with
Import-Module PowerBiFunctions
or a copy placed in the same directory as the script
Import-Module $PSScriptRoot\PowerBiFunctions.psm1
I get the following error:
Import-Module : The specified module 'PowerBiFunctions' was not loaded because no valid module file was found in any module directory.
In addition, I have made a copy of the file with the .ps1 extension and placed in the same directory. However, I can't seem to include it with simple dot sourcing:
.\PowerBiFunctions.ps1
or
. .\PowerBiFunctions.ps1
What seems to be the problem?
Create a module manifest:
# cd to module folder
Set-Location C:\Users\MyName\Documents\PowerShell\Modules\PowerBiFunctions\
# create new manifest file
New-ModuleManifest .\PowerBiFunctions.psd1 -RootModule .\PowerBiFunctions.psm1 -FunctionsToExport list,of,exported,function,names
Now you can import it by name:
Import-Module PowerBiFunctions

A Variable from a module will not be exported

I have a PowerShell Modul: SQLModul.psm1 with a variable:
$logFile="C:\logfiles\SQLLog.txt".
I also have a manifest for this module: SQLModul.psd1 where I state:
VariablesToExport = '*'
When I Import this module: import-modul SQLModul all Functions but not this variable will be exported.
Thansk for your help.
Think of the module manifest as a facade or proxy in front of the module(s) it load(s) - the manifest exporting * variables will only affect whatever variables were already exported from a nested psm1 or managed module.
Place Export-ModuleMember -Variable list,of,variable,names at the bottom of your psm1 file, in your case:
# define module functions, variables etc.
# ...
Export-Module -Variable logfile
Placing Export-ModuleMember -Variable * in the psm1 should also work, although that's probably a pretty bad idea, and is generally considered an anti-pattern

In Powershell, is there a way to ensure the #Requires -Modules always loads the latest changes?

I have a Powershell (version 5.1) module that I just added a new function to, but it will not appear in the calling Powershell script.
I created a module, let's say myModule.psm1, and manifest myModule.psd1.
The manifest has the following settings:
FunctionsToExport = '*'
CmdletsToExport = '*'
VariablesToExport = '*'
AliasesToExport = '*'
myModule.psm1 is in the myModule directory of a path I have in my PSModulePath.
I have also explicitly added the fully qualified path of myModule to the PSModulePath.
In my calling Powershell script, I have #Requires -Modules myModule at the top of the file.
If I add a function to myModule, the calling script does not seem to load the changed module.
The only way to load the change, it seems, is to use Import-Module myModule -Force. It was my understanding that #Requires should take care of this.
#Requires -Modules when supplied with only a name, only checks to see that a module is loaded. It will load it if it's not already loaded, but an old version being loaded still satisfies it.
Alternatively, you can supply a hashtable that provides the name and either a minimum or exact version.
By doing this, you could load an updated version of your module as long as you did in fact update the version with your change (which you should be).
#Requires -Modules #{ ModuleName = 'myModule' ; RequiredVersion = '1.2.3' }
Of course that's not very useful when you're testing something out since you'll have to keep changing the version, in 2 places no less.
When I'm developing modules I usually have a debug script that force loads the module and I run it any time I make a change. If your test script is really just for testing, I recommend you use Import-Module -Force instead of #Requires.

Exporting PS Members from Module Fails

I have a psm1 module with several functions. I only want to expose some of the functions, so I used "Export-ModuleMember -Function " and everything was fine.
Now I want to add a manifest, so I removed the Export-ModuleMember cmdlet and put the function names under the FunctionsToExport section of the psd1 file.
When I import the module, I can tab-complete the functions, but when I try to use them, ps says:
Test-Function : The term 'Test-Function' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
I also tried putting Export-ModuleMember -Function * into the psm1, but that didn't help.
The psm1 and psd1 files are named the same and are in the root of the module.
Thoughts? Thanks.
I found the answer. I had forgotten to un-comment the RooteModule node. Once I did that (and had module.psm1 as the value), the exported commands showed up in the "Get-Module module" output.
I would suspect that PowerShell caching mechanism is involved here. Try to run:
Get-Module -ListAvailable -Refresh
I recommend very good article on that subject written by PowerShell MVP Tobias Weltner.

Powershell import-module doesn't find modules

I'm learning PowerShell and I'm trying to build my own module library.
I've written a simple module XMLHelpers.psm1 and put in my folder $home/WindowsPowerShell/Modules.
When I do:
import-module full_path_to_XMLHelpers.psm1
It works. But when I do:
import-module XMLHelpers
It doesn't work and I get the error:
Import-Module : The specified module 'xmlhelpers' was not loaded because no valid module file was found in any module directory.
I've checked that the environment variable PSModulePath contains this folder. As it is a network folder, I've also tried to move it to a local folder and to modify PSModulePath but without success
$env:PSModulePath=$env:PSModulePath+";"+'C:\local'
Any idea on what could cause this issue?
The module needs to be placed in a folder with the same name as the module. In your case:
$home/WindowsPowerShell/Modules/XMLHelpers/
The full path would be:
$home/WindowsPowerShell/Modules/XMLHelpers/XMLHelpers.psm1
You would then be able to do:
import-module XMLHelpers
1.This will search XMLHelpers/XMLHelpers.psm1 in current folder
Import-Module (Resolve-Path('XMLHelpers'))
2.This will search XMLHelpers.psm1 in current folder
Import-Module (Resolve-Path('XMLHelpers.psm1'))
I think that the Import-Module is trying to find the module in the default directory C:\Windows\System32\WindowsPowerShell\v1.0\Modules.
Try to put the full path, or copy it to C:\Windows\System32\WindowsPowerShell\v1.0\Modules
I experienced the same error and tried numerous things before I succeeded. The solution was to prepend the path of the script to the relative path of the module like this:
// Note that .Path will only be available during script-execution
$ScriptPath = Split-Path $MyInvocation.MyCommand.Path
Import-Module $ScriptPath\Modules\Builder.psm1
Btw you should take a look at http://msdn.microsoft.com/en-us/library/dd878284(v=vs.85).aspx which states:
Beginning in Windows PowerShell 3.0, modules are imported automatically when any cmdlet or function in the module is used in a command. This feature works on any module in a directory that this included in the value of the PSModulePath environment variable ($env:PSModulePath)
I had this problem, but only in Visual Studio Code, not in ISE. Turns out I was using an x86 session in VSCode. I displayed the PowerShell Session Menu and switched to the x64 session, and all the modules began working without full paths. I am using Version 1.17.2, architecture x64 of VSCode. My modules were stored in the C:\Windows\System32\WindowsPowerShell\v1.0\Modules directory.
Some plugins require one to run as an Administrator and will not load unless one has those credentials active in the shell.
My finding with PS 5.0 on Windows 7: $ENV:PsModulePath has to end with a . This normally means it will load all modules in that path.
I'm not able to add a single module to $env:PsModulePath and get it to load with Import-Module ExampleModule. I have to use the full path to the module. e.g. C:\MyModules\ExampleModule. I am sure it used to work.
For example:
Say I have the modules:
C:\MyModules\ExampleModule
C:\MyModules\FishingModule
I need to add C:\MyModules\ to $env:PsModulePath, which will allow me to do
Import-Module ExampleModule
Import-Module FishingModule
If for some reason, I didn't want FishingModule, I thought I could add C:\MyModules\ExampleModule only (no trailing \), but this doesn't seem to work now. To load it, I have to Import-Module C:\MyModules\ExampleModule
Interestingly, in both cases, doing Get-Module -ListAvailable, shows the modules, but it won't import. Although, the module's cmdlets seem to work anyway.
AFAIK, to get the automatic import to work, one has to add the name of the function to FunctionsToExport in the manifest (.psd1) file. Adding FunctionsToExport = '*', breaks the auto load. You can still have Export-ModuleMember -Function * in the module file (.psm1).
These are my findings. Whether there's been a change or my computer is broken, remains to be seen. HTH
try with below on powershell:
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
import-module [\path\]XMLHelpers.psm1
Instead of [] put the full path
Full explanation of this and that
First of all check Your account type,some imports are not allowed to normal partner accounts.