I have a PowerShell script that reads a register.psd1 file with contents as below.
@{
# 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"
}
}
I read the file using the following command.
Import-PowerShellDataFile -Path register.psd1
After running the script I get the following error message.
Import-PowerShellDataFile : Cannot generate a PowerShell object for a ScriptBlock evaluating dynamic expressions.
What am I doing wrong and what is the possible solution?
*.psd1files contain PowerShell hashtable literals and therefore require the same syntax as when defining such literals in code:Therefore, if you want to create an entry with key
paththat contains the string literal./python/buildzig.py(or./powershell/msterminal.ps1), you must quote it - either form is OK here:path = '.\powershell\msterminal.ps1'path = ".\powershell\msterminal.ps1"However, given that in the context of a
*.psd1file you're virtually limited to literal values, use of'...'(single quotes) makes more sense (see about_Quoting_Rules).As for what you tried:
A hashtable entry such as
path = ./python/buildzig.pyattempts to create an entry with keypathand the value that is the result of executing file./python/buildzig.py, because - in the absence of quoting - the token is interpreted as a command (see about_Parsing to learn about how PowerShell parses commands and expressions).The - unfortunately vague - error message you saw (
Cannot generate a PowerShell object for a ScriptBlock evaluating dynamic expressions.), stems from the fact that for security reasons, executing commands isn't permitted in*.psd1files, which are (mostly[1]) limited to defining literal values.[1] You can use the following "variables", which in effect are constants:
$true,$false,$null. Additionally, depending on the purpose of the*.psd1file, a select few additional automatic variables are permitted:$PSCultureand$PSUICulture, except in files to be read byImport-PowerShellDataFile, and, additionally,$PSScriptRoot,$PSEdition, and$EnabledExperimentalFeaturesin module manifests - see about_Language_Modes.