2016-04-25 31 views
2

我是PowerShell的新手,在定义其他文件中“包含”的某些实用程序脚本时遇到了一些问题;问题是关于路径。让我用一个简单的例子来解释这个问题:在PowerShell中正确引用脚本

想象一下,你有一些名为utility.ps1的实用程序脚本位于/ tools下,并且你想从位于/ build下的build.ps1中调用它。现在想象一下utility.ps1调用一个名为“utility2.ps1”的文件夹中的其他实用程序脚本。所以,

utility.ps1

[...] 
.".\utility2.ps1" 
[...] 

build.ps1

[...] 
."..\tools\utility.ps1" 
[...] 

这里的问题是,从构建打电话时从这个最后utility.ps1然后一个用于utility2.ps1,powershell试图从当前目录(build)加载utility2.ps1而不是工具目录。

我现在的解决方法是pushd .打电话之前和popd之后,但它闻起来不好,我知道;另一方面,如果有一天我将脚本移动到其他位置,我需要更新所有使用移动脚本的脚本......一团糟。

所以,我做的事情非常错误;什么是适当的这样做,使客户端脚本不知道和“效用”脚本位置独立?

+0

'$ PSScriptRoot' – PetSerAl

+0

能否请你解释一下?我已经看到这个链接:http://stackoverflow.com/questions/6874779/powershell-include-another-script-that-has-includes,但要记住,我有一些间接的依赖关系,我不知道,从任何实用程序脚本中,$ PSScriptRoot中存储了什么值,所以我不能假定我应该移动到父目录的多少个步骤等。 – Luis

+2

** utility.ps1 **:'。“$ PSScriptRoot \ utility2.ps1”' ,** build.ps1 **:'。“$ PSScriptRoot \ .. \ tools \ utility.ps1”'。 – PetSerAl

回答

3

PetSerAl在评论中给出的答案是完美的,但对于PowerShell 3+将起作用。如果你希望你的脚本为向后兼容,以及某些原因,然后用下面的代码片段找到$ ScriptRootPath(这是通过$ PSScriptRoot自动填充PS 3+)

$ScriptRootPath = Split-Path $MyInvocation.MyCommand.Path -Parent 

对于PS 3+经由全局变量填充此变量:

$ScriptRootPath = $PSScriptRoot 

,然后使用该溶液作为由PetSerAl描述,
即用于utility.ps1:. "$ScriptRootPath\utility2.ps1"
个build.ps1:. "$ScriptRootPath\..\tools\utility.ps1"

另请参阅this question on SO

相关问题