我有一个PowerShell脚本,可以读取一个register.psd1
文件,内容如下。
@{
# Building Zig compiler
zig = @{
name = "zig"
path = ./python/buildzig.py
language = "Python"
os = "all"
}
# Building Windows Terminal for Windows 10.
windowsterminal = @{
name = "WindowsTerminal"
path = ./powershell/msterminal.ps1
language = "Python"
os = "windows"
}
}
我使用以下命令读取文件。
Import-PowerShellDataFile -Path register.psd1
运行脚本后,我收到以下错误消息。
Import-PowerShellDataFile : Cannot generate a PowerShell object for a ScriptBlock evaluating dynamic expressions.
我做错了什么,可能的解决方案是什么?
*.psd1
文件包含 PowerShell哈希表文本,因此需要与在代码中定义此类文本时相同的语法:
因此,如果要创建一个包含字符串文字./python/buildzig.py
(或./powershell/msterminal.ps1
)的键path
条目,则必须将其括起来- 任何一种形式都可以在这里:
path = '.powershellmsterminal.ps1'
path = ".powershellmsterminal.ps1"
但是,鉴于在*.psd1
文件的上下文中,您实际上仅限于文本值,因此使用'...'
(单引号)更有意义(请参阅about_Quoting_Rules)。
至于你尝试过的:
哈希表条目(如path = ./python/buildzig.py
)尝试创建具有键path
和执行文件./python/buildzig.py
结果的值的条目,因为 -在没有引用的情况下 - 令牌被解释为命令(请参阅about_Parsing以了解 PowerShell 如何解析命令和表达式)。
您看到的 - 不幸的是模糊的 - 错误消息(Cannot generate a PowerShell object for a ScriptBlock evaluating dynamic expressions.
)源于这样一个事实,即出于安全原因,不允许在*.psd1
文件中执行命令,这些文件(大部分[1])仅限于定义文字值。
[1] 您可以使用以下"变量",它们实际上是常量:$true
、$false
、$null
。此外,根据*.psd1
文件的用途,允许选择一些额外的自动变量:$PSCulture
和$PSUICulture
,除了要由Import-PowerShellDataFile
读取的文件,此外,模块清单中的$PSScriptRoot
、$PSEdition
和$EnabledExperimentalFeatures
- 请参阅about_Language_Modes。
我刚刚为路径参数添加了' ',如下所示,之后错误消失了。 希望这是您想要的输出。
path = '.powershellmsterminal.ps1'