【问题标题】:Powershell: Include another script that has includes?Powershell:包含另一个包含包含的脚本?
【发布时间】:2011-07-29 14:36:28
【问题描述】:

我想在制作脚本时让我的生活更轻松。我正在盯着一个小框架,它将具有包含文件的层次结构。问题是点源一个 ps1 脚本已经有其他文件点源会在原始调用脚本中制动范围。 它看起来像这样:

\config\loadvariables.ps1

$var = "shpc0001"

\config\config.ps1

. '.\loadvariables.ps1'

\test.ps1

. '.\config\config.ps1'
echo $var

问题是test.ps1 试图加载loadvariables.ps1,因为它位于test.ps1 脚本旁边。 我该如何解决这个问题?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    管理具有相互依赖关系的脚本集合的最简单方法是将它们转换为模块。此功能仅在 2.0 中可用,但它允许您将一组脚本分离为具有声明依赖关系的独立组件。

    这是一个关于启动和运行模块的教程的链接

    【讨论】:

    • 不建议这样做足够高。这绝对是你想走的路。
    • 谢谢贾里德。这就是我想要的。点源让我想起了我之前正在研究的其他一些脚本语言,我觉得它很酷。现在我意识到它是为在同一路径中快速包含而创建的。
    • 我是否理解正确,模块必须准确存储在“\WindowsPowerShell\Modules\\”(根据msdn.microsoft.com/en-us/library/dd878350(v=VS.85).aspx )?这对我来说不太理想(将脚本存储在存储库中,必须签出到与上述不同的位置)。
    • 你可以提供一个路径:Import-Module $ScriptRoot\modules\foo 或者你可以改变 $Env:PSModulePath 来告诉 Powershell 在哪里搜索由裸名指定的模块。
    • 也许我有一个独特的用例,但这种方法似乎对我不起作用,我需要在远程服务器上运行 Powershell 脚本但不能在服务器上安装任何东西,我只是允许使用 Invoke-Command 远程会话这样做。只要我需要,它就会中断。包含一个脚本,我的解决方案是制作一个命令行实用程序,它接收预期的源文件并内联输出包含的脚本。这似乎可以让我以理智的方式维护我的脚本并将其与 Invoke-Command -computername 一起使用,您是否看到任何明显的缺陷?
    【解决方案2】:

    正如 Jared 所说,模块是必经之路。但是由于您甚至可以在模块中使用点源代码,因此最好像这样使用完整路径(仍然可以在运行时计算)。

    ## Inside modules, you can refer to the module's location like so
    . "$PSScriptRoot\loadvariables.ps1"
    
    ## Outside a module, you can do this
    $ScriptRoot = Split-Path $MyInvocation.MyCommand.Path
    . "$ScriptRoot\loadvariables.ps1"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-24
      • 2016-04-25
      • 1970-01-01
      • 2019-07-26
      • 2021-09-21
      • 1970-01-01
      • 2012-02-26
      • 2012-08-15
      相关资源
      最近更新 更多