在PowerShell中正确引用脚本

时间:2016-04-25 16:01:01

标签: powershell

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

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

utility.ps1

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

build.ps1

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

这里的问题是,当从build到utility.ps1然后从最后一个调用到utility2.ps1时,powershell正在尝试从当前目录(构建)而不是工具目录中加载utility2.ps1。

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

所以,我做错了事;什么是正确的做法,使客户端脚本不知道并独立于"实用程序"脚本位置

1 个答案:

答案 0 :(得分: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