【问题标题】:Properly referencing scripts in PowerShell在 PowerShell 中正确引用脚本
【发布时间】:2016-04-25 16:01:00
【问题描述】:

我是 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 试图从当前目录(build)而不是 tools 目录加载实用程序 2.ps1。

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

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

【问题讨论】:

  • 您能详细说明一下吗?我看过这个链接:stackoverflow.com/questions/6874779/…,但请记住,我有一些间接依赖关系,而且我不知道,从任何实用程序脚本中,$PSScriptRoot 中存储了什么值,所以我不能假设我应该执行多少步骤移动到父目录等
  • utility.ps1."$PSScriptRoot\utility2.ps1"build.ps1."$PSScriptRoot\..\tools\utility.ps1".

标签: powershell


【解决方案1】:

PetSerAl 在 cmets 中的答案是完美的,但适用于 PowerShell 3+。如果出于某种原因您希望脚本也向后兼容,请使用以下代码 sn-p 查找 $ScriptRootPath(对于 PS 3+,它通过 $PSScriptRoot 自动填充)

$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

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多