*.psd1
files 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 path
that 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 *.psd1
file 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.py
attempts to create an entry with key path
and 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 *.psd1
files, 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 *.psd1
file, a select few additional automatic variables are permitted: $PSCulture
and $PSUICulture
, except in files to be read by Import-PowerShellDataFile
, and, additionally, $PSScriptRoot
, $PSEdition
, and $EnabledExperimentalFeatures
in module manifests - see about_Language_Modes.