Skip to content

About PowerShell Module Paths

This page relates my battle with OneDrive folder backup and how I fixed my broken $env:PSModulePath

img

The Problem

When trying to use ConditionalAccessAsCode I ran into a problem with running one of it's dependent modules which is the AzureADPreview module (which is only compatible with PowerShell 5.1 and not PowerShell Core (i.e. versions 6 and above))

After running Install-Module -Name AzureADPreview in PowerShell 5.1 I was getting an error running Import-Module -Name AzureADPreview:

The specified module was not loaded because no valid module file was found in any module directory

Which seemed very strange given that it seemed to have installed without error.

After quick DuckDuckGo search I got a clue from this blog article by Salaudeen Rajack

I worked out that with Install-Module the module was being installed into: C:\Users\rohan\OneDrive\Documents\WindowsPowershell\Modules

..wheras Import-Module was trying to load modules from: C:\Users\rohan\Documents\WindowsPowershell\Modules.

I quickly realised that this was because I had enabled the personal folder backup feature in OneDrive and that it had changed the path of my MyDocuments folder.

The Solution(s)

Update PSModulesPath

As I subsequently discovered, it does state in this document on that:

Microsoft OneDrive can also change the location of your Documents folder. You can verify the location of your Documents folder using the following command: [Environment]::GetFolderPath('MyDocuments').

So the cause of my problem was that the path of my MyDocuments folder had been updated form C:\Users\rohan\Documents to C:\Users\rohan\OneDrive\Documents (after enabling OneDrive PC folder backup), but that the entry for PSModulePath in my [User] Environment Variable (in PowerShell $env:PSModulePath) had not been updated accordingly.

One solution available to me was to update the value of PSModulePath in my [User] Environment Variable to add the \OneDrive\ segment into the entry for the MyDocuments folder

img

Disable OneDrive folder backup

If I disable backup then the path can go back to normal and will resolve the issue with $env:PSModulePath without having to edit the Environment Variable.

See the section 'Manage or stop PC folder backup' in this article

Are you sure you want to stop folder backup?

As it states:

When you stop backing up a folder, the files that were already backed up by OneDrive stay in the OneDrive folder, and will no longer appear in your device folder.

And so I also then need to move the Powershell and WindowsPowershell folders back into the MyDocuments folder

Change the location of OneDrive folder

I'll note this here too as I didn't do this myself and it still won't prevent the issue if you elect to use OneDrive personal folder backup...

Change the location of your OneDrive folder

Unlink this PC

A demo of PSModulePath in action

PowerShell 5 and PowerShell Core download modules into different paths and so I've prepared a couple of demos below to illustrate this.

The full script for the demo is:

"Running in Powershell $($PSVersionTable.PSVersion.Major).$($PSVersionTable.PSVersion.Minor)"
$env:PSModulePath
Install-Module -Name PSLogging -Scope CurrentUser
Get-InstalledModule
Get-InstalledModule -Name PSLogging
Get-Module -Name PSLogging
Import-Module -Name PSLogging
Get-Module -Name PSLogging
(Get-Module -Name PSLogging).Path
Remove-Module -Name PSLogging
Uninstall-Module -Name PSLogging
"Running in Powershell $($PSVersionTable.PSVersion.Major).$($PSVersionTable.PSVersion.Minor)"
$env:PSModulePath
# Note: Installing sudo to avoid having to open an elevated shell
scoop install sudo
sudo Install-Module -Name PSLogging -Scope AllUsers
Get-InstalledModule
Get-InstalledModule -Name PSLogging
Get-Module -Name PSLogging
Import-Module -Name PSLogging
Get-Module -Name PSLogging
(Get-Module -Name PSLogging).Path
Remove-Module -Name PSLogging
sudo Uninstall-Module -Name PSLogging

Here's a demo in PowerShell 5.1:

... and here's the same demo in PowerShell 7.1:


Last update: 2021-03-30

Comments