有没有办法在同一个 PSD1 文件中引用参数值?

Is there a way to reference a parameter value within the same PSD1 file?

假设我有一个 PSD1 文件,代码如下:

@{
    AllNodes = @(
    @{
        NodeName = $env:COMPUTERNAME
        Tags = @{
            Environment = "dev"
            Datacenter = "east 1"
        }
        Data = @{
            ConfigName = [Tags.Environment]-[Tags.Datacenter.replace(" ","-")]
        }
    })
}

看看我稍后如何尝试在同一个文件中引用“标签”部分?有什么方法可以做到这一点,还是我只需要在单独的 PS1 文件中这样做?

正如 iRon 指出的那样,您想要做的是 支持(并且,如果它是,会带来实施挑战 - 请参阅底部)。

出于安全考虑(防止注入不需要的代码和数据),PowerShell 严格限制 *.psd1 文件中允许的内容:

  • 简而言之,*.psd1 文件包含 a 哈希表文字 (@{ .. }),其值必须是 文字 - 唯一的例外是以下 automatic variables (which, conceptually, are constants): $true, $false, and $null and, depending on context, $PSCulture and $PSUICulture (with Import-LocalizedData 和模块清单)并且仅在模块清单中 $PSScriptRoot$PSEdition$EnabledExperimentalFeatures(后两个仅在 PowerShell (Core) 7+ 中)。 [DSC]

  • 值得注意的是,防止使用:

    • 自定义和环境变量。

      • 例外:在 DSC(您的示例)环境变量(例如 $env:COMPUTERNAME)的上下文中 允许的。
    • 命令和方法调用,包括在可扩展字符串 ("...")

      中通过 $(...)

注意:*.psd1 个文件用于以下 上下文


至于你的想法:

假设允许哈希表内交叉引用:

  • 当然是可取的,以避免重复和减少维护负担。

  • 安全的角度来看是没有问题的,因为不会引用外部值。

  • 实施的角度来看具有挑战性,但是:

    • 上下文自动变量,例如 $this(例如,已经存在于 classes 中)必须定义以便能够引用其他同一哈希表中的条目。

      • 为了引用特定的键,例如$this.AllNodes.Tags.Environment,在可扩展字符串 ("...") 中,然后您需要使用 $(...) ,目前不允许。
    • 必须检查并防止条目之间的循环依赖性。

如果您对拥有这样的功能感到足够强烈,我鼓励您submit a feature request on GitHub