2014-03-08 4 views
4

Я хочу загрузить содержимое файла 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?

+0

$ PrivateData.Config # = => Является ли это опечаткой или у вас действительно есть это там? – mjolinor

+0

@mjolinor - да, это была опечатка. это не в моем коде –

+1

Я считаю, что 'PrivateData' должен быть для параметров конфигурации, записанных в файле psd1 (и, следовательно, изменен в psd1, даже для подписанных модулей). Если вы читаете конфигурацию из отдельного XML-файла, в чем причина «помещения» его в «PrivateData». Вы можете просто ввести переменную с областью действия под названием '$ Config' или аналогичную. Затем он будет доступен для всех функций внутри этого модуля. –

ответ

2

Вам, скорее всего, потребуется получить доступ к личным данным, используя переменную $ MyInvocation. Тем не менее, я только получил его, чтобы работать, вызвав его из функции. Чтобы загрузить его в переменную в файле PSM1, я вызываю функцию оттуда. Об этом я узнал от https://social.technet.microsoft.com/Forums/windowsserver/en-US/9620af9a-0323-460c-b3e8-68a73715f99d/module-scoped-variable?forum=winserverpowershell.

function Get-PD 
{ 
    [CmdletBinding()] 
    Param() 
    Begin{} 
    Process 
    { 
     $MyInvocation.MyCommand.Module.PrivateData 
    } 
    End{} 
} 

$MyPD = Get-PD 
Смежные вопросы