【问题标题】:Dot-source file from different locations来自不同位置的点源文件
【发布时间】:2018-08-25 06:23:16
【问题描述】:

我正在将一个“函数库”文件点源到我正在处理的每个 Powershell 脚本中。

目前,我将此文件放在与脚本相同的目录中,并按如下方式对其进行点源:

. (Join-Path $PSScriptRoot FunctionLibrary.ps1)

一旦脚本在与脚本正在执行的操作相关的特定位置的服务器上“投入生产”,这就很好了。但是,当我从网络驱动器上的通用“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,但似乎都没有什么不同。

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

  • 如何测试文件是否存在(大概是Test-Path?),如果存在则对其进行点源处理?
  • 如何在 Powershell 中对文件进行点源处理,并忽略无法找到的文件中的任何错误?

提前致谢。附言如果有版主想要描述一个更相关的标题,请随意 - 我已经尝试过但失败了!

【问题讨论】:

    标签: powershell dot-source


    【解决方案1】:

    您基本上已经回答了您自己的问题,只需要继续您对Test-Path 的思考。通过在尝试点源文件之前测试文件的可用性,您最终不会出现任何错误(错误是您尝试点源文件不存在。)

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

    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'
    }
    

    【讨论】:

    • 傻我! :) 谢谢Windos,我会将您的答案标记为正确。你对我的问题的第二部分有什么建议吗?我很欣赏它与 If 声明无关,但它可能会在未来被证明在其他情况下使用。
    • 您可以使用 try/catch 块。在 catch 中不放置任何内容将意味着不输出任何内容,或者在其中放置您自己的警告消息:try {. c:\notthere.ps1} catch {}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2015-01-10
    相关资源
    最近更新 更多