我有一个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.
我在做什么错,可能的解决方法是什么?
答案 0 :(得分:0)
错误消失后,我为路径参数添加了“”,如下所示。希望这是您想要的输出。
path = '.\powershell\msterminal.ps1'
答案 1 :(得分:0)
*.psd1
文件包含PowerShell hashtable字面量 ,因此需要与在代码中定义此类字面量时相同的语法。 :
因此,如果您要创建一个包含包含字符串文字 path
(或./python/buildzig.py
)的键./powershell/msterminal.ps1
的条目,则必须引用-两种形式都可以在这里使用
path = '.\powershell\msterminal.ps1'
path = ".\powershell\msterminal.ps1"
但是,鉴于在*.psd1
文件的上下文中您实际上只限于 literal 值,因此使用'...'
(单引号)更有意义(请参见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。