这应该是一个简单的任务,但我已经看到了几次尝试如何获取执行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 回答
您还可以使用:
括号中的部分返回PathInfo对象 .
(自PowerShell 2.0起可用 . )
你会认为使用' . '作为路径意味着它是调用路径 . 但不是所有的时间 . 例如,如果您在作业ScriptBlock中使用它 . 在这种情况下,它可能指向%profile%\ Documents .
试试:
要么:
这样做的可靠方法就像你展示
$MyInvocation.MyCommand.Path
一样 .使用相对路径将基于$ pwd,PowerShell,应用程序的当前目录或.NET API的当前工作目录 .
试试这个:
我喜欢一行solution :)
要扩展@Cradle的答案:你还可以写一个multi-purpose function,根据OP的问题得到相同的结果:
在Powershell 3及以上版本中,您可以简单地使用
$PSScriptRoot
最简单的方法似乎是使用以下预定义变量:
about_Automatic_Variables和about_Scripts都表示:
我这样使用它:
Get-Location
将返回当前位置:是的,应该工作 . 但如果您需要查看绝对路径,这就是您所需要的:
路径通常为空 . 此功能更安全 .