有没有办法在同一个 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
个文件用于以下 上下文 :
作为module manifests, such as created with New-ModuleManifest
-
作为配置数据的通用存储,由Import-PowerShellDataFile
读取
- 注意:从 PowerShell 7.2 开始,这种使用受到以下事实的阻碍:编程创建 此类文件尚不支持 - 修复已在 GitHub issue #2875,正在等待社区实施。
[实践中很少见]在script internationalization, via Import-LocalizedData
or via intra-script DATA
sections.
至于你的想法:
假设允许哈希表内交叉引用:
当然是可取的,以避免重复和减少维护负担。
从安全的角度来看是没有问题的,因为不会引用外部值。
从实施的角度来看具有挑战性,但是:
上下文自动变量,例如 $this
(例如,已经存在于 class
es 中)必须定义以便能够引用其他同一哈希表中的条目。
- 为了引用特定的键,例如
$this.AllNodes.Tags.Environment
,在可扩展字符串 ("..."
) 中,然后您需要使用 $(...)
,目前不允许。
必须检查并防止条目之间的循环依赖性。
如果您对拥有这样的功能感到足够强烈,我鼓励您submit a feature request on GitHub。
假设我有一个 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
(withImport-LocalizedData
和模块清单)并且仅在模块清单中$PSScriptRoot
和$PSEdition
和$EnabledExperimentalFeatures
(后两个仅在 PowerShell (Core) 7+ 中)。 [DSC]值得注意的是,防止使用:
自定义和环境变量。
- 例外:在 DSC(您的示例)环境变量(例如
$env:COMPUTERNAME
)的上下文中 是 允许的。
- 例外:在 DSC(您的示例)环境变量(例如
命令和方法调用,包括在可扩展字符串 (
中通过"..."
)$(...)
注意:*.psd1
个文件用于以下 上下文 :
作为module manifests, such as created with
New-ModuleManifest
作为配置数据的通用存储,由
读取Import-PowerShellDataFile
- 注意:从 PowerShell 7.2 开始,这种使用受到以下事实的阻碍:编程创建 此类文件尚不支持 - 修复已在 GitHub issue #2875,正在等待社区实施。
[实践中很少见]在script internationalization, via
Import-LocalizedData
or via intra-scriptDATA
sections.
至于你的想法:
假设允许哈希表内交叉引用:
当然是可取的,以避免重复和减少维护负担。
从安全的角度来看是没有问题的,因为不会引用外部值。
从实施的角度来看具有挑战性,但是:
上下文自动变量,例如
$this
(例如,已经存在于class
es 中)必须定义以便能够引用其他同一哈希表中的条目。- 为了引用特定的键,例如
$this.AllNodes.Tags.Environment
,在可扩展字符串 ("..."
) 中,然后您需要使用$(...)
,目前不允许。
- 为了引用特定的键,例如
必须检查并防止条目之间的循环依赖性。
如果您对拥有这样的功能感到足够强烈,我鼓励您submit a feature request on GitHub。