这应该是一个简单的任务,但是我已经看到过几次关于如何获取已执行cmdlet所在目录的路径的尝试,结果好坏参半。例如,当我执行C:\temp\myscripts\mycmdlet。我想能够将C:\temp\myscripts存储在mycmdlet.ps1中的一个变量中。

这是一个有效的解决方案(尽管有点麻烦):

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

另一个人建议这样的解决方案,它只适用于我们的测试环境:

$settingspath = '.\settings.xml'

我非常喜欢后一种方法,与每次都将文件路径解析为参数相比,我更喜欢这种方法,但我无法让它在我的开发环境中工作。我该怎么办?这与PowerShell的配置方式有关吗?


当前回答

如果你只需要当前目录的名称,你可以这样做:

((Get-Location) | Get-Item).Name

假设您正在从C:\Temp\Location\MyWorkingDirectory>工作

输出

MyWorkingDirectory

其他回答

是的,应该可以。但如果你需要看到绝对路径,这就是你所需要的:

(Get-Item .).FullName

你会认为使用'。\'作为路径意味着它是调用路径。但也不是所有时候。例如,如果您在作业ScriptBlock中使用它。在这种情况下,它可能指向%profile%\Documents。

你还可以使用:

(Resolve-Path .\).Path

括号中的部分返回一个PathInfo对象。

(PowerShell 2.0起可用。)

这是我想到的。它是一个包含多个方法的数组,用于查找路径,使用当前位置,过滤空\空结果,并返回第一个非空值。

@((
  ($MyInvocation.MyCommand.Module.ModuleBase),
  ($PSScriptRoot),
  (Split-Path -Parent -Path $MyInvocation.MyCommand.Definition -ErrorAction SilentlyContinue),
  (Get-Location | Select-Object -ExpandProperty Path)
) | Where-Object { $_ })[0]

不管怎样,作为一个单行的解决方案,下面是一个对我来说有效的解决方案。

$currFolderName = (Get-Location).Path.Substring((Get-Location).Path.LastIndexOf("\")+1)

最后的1表示忽略/。

感谢上面使用Get-Location cmdlet的帖子。