Я хочу загрузить содержимое файла config.xml и сохранить его в $PrivateData
при загрузке моего модуля. Вот строка определения в моем PSD1Доступ к PrivateData во время импорта-модуля
# Private data to pass to the module specified in ModuleToProcess
PrivateData = @{'Variables'[email protected]{};'Config'=$null}
Это создает хэш-таблицу с двумя элементами. 1) Variables
- это вторая хэш-таблица, которую я использую для хранения личных переменных для моего модуля. 2) Config, который будет содержать значения файла config.xml. Пример XML:
<Config>
<Foo>Bar</Foo>
</Config>
Я могу загрузить XML с помощью следующей строки:
$PrivateData = $MyInvocation.MyCommand.Module.PrivateData
$PrivateData.Config = ([xml](Get-Content $PSScriptRoot\Config.xml | Out-String)).Config
Это не кажется, что я могу получить доступ к нему в моем файле PSM1. Я могу обернуть его в CMDlet так:
Function Initialize-TestModule {
$PrivateData = $MyInvocation.MyCommand.Module.PrivateData
$PrivateData.Config #= ([xml](Get-Content $PSScriptRoot\Config.xml | Out-String)).Config
}
Но тогда пользователь должен сделать вызов Import-Module
, а затем второй вызов Initialize-TestModule
который я пытаюсь избежать.
Если я ставлю код в PSM1 он генерирует эту ошибку, когда я называю Import-Module
Property 'Config' cannot be found on this object; make sure it exists and is settable.
At C:\scripts\temp\TestModule\TestModule.psm1:7 char:2
+ $PrivateData.Config = ([xml](Get-Content $PSScriptRoot\Config.xml | Out-String) ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound
Если я пытаюсь загрузить в PSD1 так:
PrivateData = @{'Variables'[email protected]{};'Config'=([xml](Get-Content $PSScriptRoot\Config.xml | Out-String)).Config}
я получаю эти ошибки:
Import-Module : The module manifest 'C:\scripts\temp\TestModule\TestModule.psd1' could not be processed because it is
not a valid Windows PowerShell restricted language file. Please remove the elements that are not permitted by the
restricted language:
At C:\scripts\temp\TestModule\TestModule.psd1:88 char:26
+ PrivateData = @{'Config'=([xml](Get-Content $PSScriptRoot\Config.xml | Out-Strin ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Property references are not allowed in restricted language mode or a Data section.
At C:\scripts\temp\TestModule\TestModule.psd1:88 char:27
+ PrivateData = @{'Config'=([xml](Get-Content $PSScriptRoot\Config.xml | Out-Strin ...
+ ~~~~~
The type xml is not allowed in restricted language mode or a Data section.
At C:\scripts\temp\TestModule\TestModule.psd1:88 char:33
+ PrivateData = @{'Config'=([xml](Get-Content $PSScriptRoot\Config.xml | Out-Strin ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The command 'Get-Content' is not allowed in restricted language mode or a Data section.
At C:\scripts\temp\TestModule\TestModule.psd1:88 char:72
+ PrivateData = @{'Config'=([xml](Get-Content $PSScriptRoot\Config.xml | Out-Strin ...
+ ~~~~~~~~~
The command 'Out-String' is not allowed in restricted language mode or a Data section.
At line:1 char:1
+ Import-Module .\TestModule -force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (C:\scripts\temp...TestModule.psd1:String) [Import-Module], Missing
MemberException
+ FullyQualifiedErrorId : Modules_InvalidManifest,Microsoft.PowerShell.Commands.ImportModuleCommand
в моем PSM1 попытались сделать вызов Initialize-TestModule
используя Invoke-Command
и Start-Job
оба из которых не удались. Так кому-то удалось получить доступ к $ PrivateData во время Import-Module
?
$ PrivateData.Config # = => Является ли это опечаткой или у вас действительно есть это там? – mjolinor
@mjolinor - да, это была опечатка. это не в моем коде –
Я считаю, что 'PrivateData' должен быть для параметров конфигурации, записанных в файле psd1 (и, следовательно, изменен в psd1, даже для подписанных модулей). Если вы читаете конфигурацию из отдельного XML-файла, в чем причина «помещения» его в «PrivateData». Вы можете просто ввести переменную с областью действия под названием '$ Config' или аналогичную. Затем он будет доступен для всех функций внутри этого модуля. –