Dot-source 个来自不同位置的文件

Dot-source file from different locations

我正在 dot-sourcing 一个 "function library" 文件到我正在处理的每个 Powershell 脚本中。

目前,我将此文件放在与脚本相同的目录中,dot-sourcing 如下所示:

. (Join-Path $PSScriptRoot FunctionLibrary.ps1)

一旦脚本运行 "into production",就可以在服务器上位于与脚本正在执行的操作相关的特定位置。但是,当我从我的网络驱动器上的通用 "Powershell" 文件夹构建脚本时,这意味着我最终会在几个不同的文件夹中得到相同的文件——编辑一个文件只是时间问题函数库然后对不同的文件进行不同的编辑,最终得到应该是同一个文件的无数版本。

理想情况下,我想将此函数库文件存储在 "G:\PowerShell\Function Library" 中,如果脚本的工作目录中不存在这样的文件,则引用它。

这个的伪代码是这样的:

If( File Exists in C:\Location ) {
    Load C:\Location\File
}
ElseIf( File Exists in "This Directory" ) {
    Load "This Directory"\File
}
Else {
    Log "Unable to load functions library, exiting"
    Exit
}

为了现在实现这个目标,我只是在做:

. (Join-Path $PSScriptRoot FunctionLibrary.ps1)
. "G:\Powershell\Function Library\FunctionLibrary.ps1"

这有效,但总是给我一个错误 - 我无法找到消除错误的方法。我试过 -ErrorAction "SilentlyContinue"| Out-Null 但似乎都没有什么不同。

因此,我想这个问题有两个可能的答案,也许同时回答这两个问题对本主题的未来读者有好处:

提前致谢。 P.S。如果任何版主想要描述更相关的标题,请随意 - 我已经尝试过但失败了!

您基本上已经回答了您自己的问题,只需要按照您对 Test-Path 的思路进行操作即可。通过在尝试 dot-source 文件之前测试文件的可用性,您不会遇到任何错误(错误是您试图 dot-source 一个不存在的文件。)

这是你的伪代码的调整版本:

if (Test-Path -Path 'C:\Location\file.ps1') {
    . 'C:\Location\file.ps1'
}
elseif (Test-Path -Path "$PSScriptRoot\file.ps1") {
    . "$PSScriptRoot\file.ps1"
}
else {
    Write-Warning -Message 'file.ps1 not found'
}