首页 文章

如何获取正在执行的cmdlet的当前目录

提问于
浏览
166

这应该是一个简单的任务,但我已经看到了几次尝试如何获取执行cmdlet所在目录的路径并获得了成功 . 例如,当我在 c:\temp\myscripts\settings.xml 执行 c:\temp\myscripts\mycmdlet.ps1 设置文件时,我希望能够将 c:\temp\myscripts 存储在 mycmdlet.ps1 中的变量中 .

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

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

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

$settingspath = '.\settings.xml'

我非常喜欢后一种方法,并且更喜欢每次都必须将文件路径解析为参数,但我不能让它在我的开发环境中工作 . 有没有人建议做什么?它与PowerShell的配置方式有关吗?

12 回答

  • 9

    您还可以使用:

    (Resolve-Path .\).Path
    

    括号中的部分返回PathInfo对象 .

    (自PowerShell 2.0起可用 . )

  • 108

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

  • 39

    试试:

    (Get-Location).path
    

    要么:

    ($pwd).path
    
  • 11

    这样做的可靠方法就像你展示 $MyInvocation.MyCommand.Path 一样 .

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

  • 20

    试试这个:

    $WorkingDir = Convert-Path .
    
  • 15

    我喜欢一行solution :)

    $scriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
    
  • 0

    要扩展@Cradle的答案:你还可以写一个multi-purpose function,根据OP的问题得到相同的结果:

    Function Get-AbsolutePath {
    
        [CmdletBinding()]
        Param(
            [parameter(
                Mandatory=$false,
                ValueFromPipeline=$true
            )]
            [String]$relativePath=".\"
        )
    
        if (Test-Path -Path $relativePath) {
            return (Get-Item -Path $relativePath).FullName -replace "\\$", ""
        } else {
            Write-Error -Message "'$relativePath' is not a valid path" -ErrorId 1 -ErrorAction Stop
        }
    
    }
    
  • 1

    在Powershell 3及以上版本中,您可以简单地使用

    $PSScriptRoot

  • 64

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

    $PSScriptRoot
    

    about_Automatic_Variablesabout_Scripts都表示:

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

    我这样使用它:

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

    Get-Location 将返回当前位置:

    $Currentlocation=Get-Location
    
  • 0

    是的,应该工作 . 但如果您需要查看绝对路径,这就是您所需要的:

    (Get-Item -Path ".\").FullName
    
  • 217

    路径通常为空 . 此功能更安全 .

    function Get-ScriptDirectory
    {
        $Invocation = (Get-Variable MyInvocation -Scope 1).Value;
        if($Invocation.PSScriptRoot)
        {
            $Invocation.PSScriptRoot;
        }
        Elseif($Invocation.MyCommand.Path)
        {
            Split-Path $Invocation.MyCommand.Path
        }
        else
        {
            $Invocation.InvocationName.Substring(0,$Invocation.InvocationName.LastIndexOf("\"));
        }
    }
    

相关问题