I'm trying to create a powershell module to store some reusable utility functions. I created script module PsUtils.psm1 and script module manifest PsUtils.psd1 (used these 
When I hover cursor over the function I only get this:
PsUtils.psm1
function Get-Filelist {
Param(
[Parameter(Mandatory=$true)]
[string[]]
$DirectoryPath
)
Write-Host "DIR PATH: $DirectoryPath"
}
PsUtils.psd1 (excerpt)
...
FunctionsToExport = '*'
I have Powershell extension installed. Do I need to install anything else to make the suggestions work? What am I missing?
CodePudding user response:
Generally speaking, only auto-loading modules - i.e., those in one of the directories listed in environment variable
$env:PSModulePath- are automatically discovered.As of version v2022.7.2 of the PowerShell extension, the underlying PowerShell editor services make no attempt to infer from the current source-code file what modules in nonstandard directories are being imported via source code in that file, whether via
Import-Moduleorusing moduleDoing so would be the prerequisite for discovering the commands exported by the modules being imported.
Doing so robustly sounds virtually impossible to do with the static analysis that the editor services are limited to performing, although it could work in simple cases; if I were to guess, such a feature request wouldn't be entertained, but you can always ask.
Workarounds:
Once you have imported a given module from a nonstandard location into the current session - either manually via the PIC (PowerShell Integrated Console) or by running your script (assuming the Import-Module call succeeds), the editor will provide IntelliSense for its exported commands from that point on, so your options are (use one of them):
Run your script in the debugger at least once before you start editing. You can place a breakpoint right after the
Import-Modulecall and abort the run afterwards - the only prerequisite is that the file must be syntactically valid.Run your
Import-Modulecommand manually in the PIC, replacing$PSScriptRootwith your script file's directory path.Note: It is tempting to place the cursor on the
Import-Moduleline in the script in order to use F8 to run just this statement, but, as of v2022.7.2, this won't work in your case, because$PSScriptRootis only valid in the context of running an entire script.GitHub issue #633 suggests adding special support for
$PSScriptRoot; while the proposal has been green-lighted, no one has stepped up to implement it since.
(Temporarily) modify the
$env:PSModulePathvariable to include the path of your script file's directory.The most convenient way to do that is via the
$PROFILEfile that is specific to the PowerShell extension, which you can open for editing withpsedit $PROFILEfrom the PIC.- Note: Make sure that profile loading is enabled in the PowerShell extension's settings.
E.g., if your directory path is
/path/to/my/module, add the following:$env:PSModulePath ="$([IO.Path]::PathSeparator)/path/to/my/module"The caveat is that all scripts / code that is run in the PIC will see this updated
$env:PSModulePathvalue, so at least hypothetically other code could end up mistakenly importing your module instead of one expected to be in the standard locations.Note that GitHub issue #880 is an (old) proposal to allow specifying
$env:PSModulePathentries as part of the PowerShell extension settings instead.
On a somewhat related note:
- Even when a module is auto-discovered / has been imported, IntelliSense only covers its exported commands, whereas while you're developing that module you'd also like to see its private commands. Overcoming this limitation is the subject of GitHub issue #104.

