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

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

这是一个有效的解决scheme(尽pipe有点麻烦):

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

另一个人提出这个解决scheme只适用于我们的testing环境:

 $settingspath = '.\settings.xml' 

我非常喜欢后一种方法,并且更喜欢每次都必须将文件path作为参数进行parsing,但我无法使其在我的开发环境中工作。 有没有人有什么build议? 它与PowerShell的configuration有什么关系?

可靠的方法就像你显示$MyInvocation.MyCommand.Path

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

是的,应该工作。 但是,如果你需要看到绝对path,这是你所需要的一切:

 (Get-Item -Path ".\" -Verbose).FullName 

你也可以使用:

 (Resolve-Path .\).Path 

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

(自PowerShell 2.0以来可用。)

path通常是空的。 这个function更安全。

 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("\")); } } 

最简单的方法似乎是使用以下预定义的variables,但我不确定它是否是特定于版本的:

  $PSScriptRoot 

我这样使用它:

  $MyFileName = "data.txt" $filebase = $PSScriptRoot + "\" + $MyFileName 

尝试以下任一方法:(Get-Location).path或($ pwd).path

获取位置将返回当前位置

$ Currentlocation = GET-位置

我喜欢这一行解决scheme 🙂

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

尝试这个:

 $WorkingDir = Convert-Path . 

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

要扩展@Cradle的答案:你也可以写一个多用途的函数 ,根据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 } }