3

我有一个 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.

我做错了什么,可能的解决方案是什么?

4

2 回答 2

1

*.psd1文件包含 PowerShell哈希表文字,因此需要与在代码中定义此类文字时相同的语法

path因此,如果您想使用包含字符串文字 ./python/buildzig.py(或)的键创建一个条目,则./powershell/msterminal.ps1必须引用它 - 任何一种形式都可以:

  • path = '.\powershell\msterminal.ps1'
  • path = ".\powershell\msterminal.ps1"

但是,鉴于在*.psd1文件的上下文中您实际上仅限于文字值,因此使用'...'(单引号)更有意义(请参阅about_Quoting_Rules)。


至于你尝试了什么:

哈希表条目,例如 path = ./python/buildzig.py尝试使用作为执行文件path结果的键和值创建条目,因为 -在没有引用的情况下- 令牌被解释为命令(请参阅about_Parsing以了解 PowerShell 如何解析命令和表达式)。./python/buildzig.py

您看到的 - 不幸的是含糊不清的错误消息 ( 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

于 2019-06-09T16:21:29.807 回答
0

在错误消失之后,我刚刚为路径参数添加了“”,如下所示。希望这是您想要的输出。

path = '.\powershell\msterminal.ps1'
于 2019-06-09T11:06:16.120 回答