PowerShell,无法读取数据文件

时间:2019-06-08 20:43:42

标签: powershell powershell-v6.0

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

我在做什么错,可能的解决方法是什么?

2 个答案:

答案 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$PSUICultureImport-PowerShellDataFile读取的文件除外,以及,此外,模块清单中的$PSScriptRoot$PSEdition$EnabledExperimentalFeatures -请参见about_Language_Modes