6
votes

I have a module in a folder that I have created, C:\PowerShellScripts\Modules. I call this mod.psm1. This file contains two simple functions: Write-hello and Write-bye.

Now, I have added this path(C:\PowerShellScripts\Modules) to my PSModulePath Environment variables path.

Accordingly, this should auto load the module when I start PowerShell. Correct?

But when I run PowerShell and try Write-hello or Write-bye it gives an error

write-hello : The term 'write-hello' is not recognized as the name of a cmdlet, function, script file, or operable program

PowerShell does not load the mod.psm1 file even though $ENV:PSModulePath shows my path (C:\PowerShellScripts\Modules)

And I need to manually use Import-Module again. What could be wrong?

2
A module is always installed in a folder that has the same name as the module itself. The name of the module is the file name that contains the module minus the .psm1 extension. Hence my mod.psm1 file would go into the "mod" folder and now it is accessible!Kiran6699
To add, The Folder name can be different than .psm1 file name, but there has to be atleast one Binary module(.dll) or Module Manifest(.psd1) with the same name as the folder.Nitesh

2 Answers

22
votes

According to documentation available here:

A "well-formed" module is a module that is stored in a directory that has the same name as the base name of at least one file in the module directory. If a module is not well-formed, Windows PowerShell does not recognize it as a module.

The "base name" of a file is the name without the file name extension. In a well-formed module, the name of the directory that contains the module files must match the base name of at least one file in the module.

This is the reason when you made a directory named mod (same base name as the file mod.psm1) and put the module inside it, you could access your cmdlets.

4
votes

I figured it out. I needed to add my mod.psm1 file to a folder named "mod". Now I can directly access my cmdlets write-hello or write-bye when i start PowerShell.