Search code examples
powershellpowershell-cmdlet

How to get the current directory of the cmdlet being executed


This should be a simple task, but I have seen several attempts on how to get the path to the directory where the executed cmdlet is located with mixed success. For instance, when I execute C:\temp\myscripts\mycmdlet.ps1 which has a settings file at C:\temp\myscripts\settings.xml I would like to be able to store C:\temp\myscripts in a variable within mycmdlet.ps1.

This is one solution which works (although a bit cumbersome):

$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path
$settingspath = $directorypath + '\settings.xml'

Another one suggested this solution which only works on our test environment:

$settingspath = '.\settings.xml'

I like the latter approach a lot and prefer it to having to parse the filepath as a parameter each time, but I can't get it to work on my development environment. What should I do? Does it have something to do with how PowerShell is configured?


Solution

  • The reliable way to do this is just like you showed $MyInvocation.MyCommand.Path.

    Using relative paths will be based on $pwd, in PowerShell, the current directory for an application, or the current working directory for a .NET API.

    PowerShell v3+:

    Use the automatic variable $PSScriptRoot.