PowerShell, не удается прочитать файл данных - PullRequest
2 голосов
/ 08 июня 2019

У меня есть сценарий 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 голосов
/ 09 июня 2019

*.psd1 файлы содержат PowerShell хеш-таблица литералы и поэтому требуют такой же синтаксис , как при определении таких литералов в коде :

Поэтому, если вы хотите создать запись с ключом path, содержащую строковый литерал ./python/buildzig.py (или ./powershell/msterminal.ps1), вы должны заключить в кавычки это - либо Форма в порядке здесь:

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

Однако, учитывая, что в контексте файла *.psd1 вы фактически ограничены литеральными значениями, использование '...' (одинарные кавычки) имеет больше смысла (см. about_Quoting_Rules *) 1036 *).


Что касается , что вы пытались :

Запись хеш-таблицы, такая как path = ./python/buildzig.py, пытается создать запись с ключом path и значением, которое является результатом выполнения file ./python/buildzig.py, потому что - при отсутствии цитирование - токен интерпретируется как команда (см. about_Parsing , чтобы узнать, как PowerShell анализирует команды и выражения).

- к сожалению, смутное - сообщение об ошибке, которое вы видели (Cannot generate a PowerShell object for a ScriptBlock evaluating dynamic expressions.), проистекает из того факта, что по соображениям безопасности, выполнение команд не разрешено в *.psd1 файлах , которые (в основном *) 1063 * [1] ) ограничено определением литералов значений.


[1] Вы можете использовать следующие «переменные», которые в действительности являются константами : $true, $false, $null. Кроме того, в зависимости от назначения файла *.psd1 допускается выбор нескольких дополнительных автоматических переменных: $PSCulture и $PSUICulture, за исключением файлов, которые должны быть прочитаны с помощью Import-PowerShellDataFile, и, кроме того, $PSScriptRoot, $PSEdition и $EnabledExperimentalFeatures в модульных манифестах - см. about_Language_Modes .

0 голосов
/ 09 июня 2019

Я только что добавил '' для параметров пути следующим образом, после этого ошибка исчезла. надеюсь, что это выход, который вы хотели.

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