这应该是一个简单的任务,但是我已经看到过几次关于如何获取已执行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

其他回答

最简单的方法似乎是使用以下预定义变量:

 $PSScriptRoot

about_Automatic_Variables和about_Scripts都声明:

在PowerShell 2.0中,此变量仅在脚本模块(.psm1)中有效。从PowerShell 3.0开始,它在所有脚本中都有效。

我是这样使用的:

 $MyFileName = "data.txt"
 $filebase = Join-Path $PSScriptRoot $MyFileName

这个函数将提示位置设置为脚本路径,处理vscode, psise和PWD之间获取脚本路径的不同方式:

function Set-CurrentLocation
{
    $currentPath = $PSScriptRoot                                                                                                     # AzureDevOps, Powershell
    if (!$currentPath) { $currentPath = Split-Path $pseditor.GetEditorContext().CurrentFile.Path -ErrorAction SilentlyContinue }     # VSCode
    if (!$currentPath) { $currentPath = Split-Path $psISE.CurrentFile.FullPath -ErrorAction SilentlyContinue }                       # PsISE

    if ($currentPath) { Set-Location $currentPath }
}

可靠的方法就像您显示的$ myinvoke . mycommand . path一样。

使用相对路径将基于PowerShell中的$pwd,应用程序的当前目录或. net API的当前工作目录。

PowerShell v3 +:

使用自动变量$PSScriptRoot。

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

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

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

输出

MyWorkingDirectory

你还可以使用:

(Resolve-Path .\).Path

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

(PowerShell 2.0起可用。)