SecretReptoid
SecretReptoid

Reputation: 13

How to get the file directory for a custom cmdlet

The way our business is set up, our custom cmdlets are spread out across the network in several different larger files. We refer to these files in the usual "Microsoft.PowerShell_profile.ps1"

Is there something I can run within Powershell to find where a cmdlet is running from instead of manually going through all the files referenced in "Microsoft.PowerShell_profile.ps1" to find it?

E.g. if I have written a cmdlet called Get-UserExpiry and it is saved in C:\User\Name\Documents\CustomCmds.ps1, and I include that file path in Microsoft.PowerShell_profile.ps1, is there a command I can use to find that file path if all I know is the cmdlet name?

Upvotes: 1

Views: 400

Answers (1)

Sage Pourpre
Sage Pourpre

Reputation: 10323

Get-Command is what you need. That being said, depending on the command you are testing and the type of the command (external application, function, cmdlet, profile function), the command path won't always be assigned to the same property / subproperty.

Here's a way to get the path no matter where it is disclosed.

Function definition

Here we check the possible locations of the path based on the Get-Command result, filter out everything that is $null or empty and pick the first result we get.

Function Get-CommandLocation($Command) {
    $definition = (Get-Command -Name $Command)
    @(
        $definition.Module.Path
        $definition.Source
        $definition.ScriptBlock.File
    ) | Where-Object { $_ } | Select-Object -First 1
}

Examples

Get-CommandLocation Get-Item  # Native cmdlet
# Value obtained from (Get-Command -Name 'Get-Item').Module.Path
# Return C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Management\Microsoft.PowerShell.Management.psd1
 
Get-CommandLocation Edit-Profile # Custom profile function (Test with a function in your profile (if any))
# Value obtained from(Get-Command -Name 'Edit-Profile').ScriptBlock.File
# Return C:\Users\SagePourpre\Documents\WindowsPowerShell\Microsoft.VSCode_profile.ps1
 
Get-CommandLocation New-ExternalHelp # PlatyPS module downloaded from the gallery
# Value obtained from (Get-Command New-ExternalHelp).Module.Path
# Return C:\Program Files\WindowsPowerShell\Modules\platyPS\0.14.2\platyPS.psm1

Get-CommandLocation -command cmd # External Program
# Value located in  (Get-Command -Name 'cmd').Source
# Return C:\Windows\system32\cmd.exe

Upvotes: 1

Related Questions