2015-01-08 2 views
3

У меня есть двумерный массив имен и значений свойств, которые мне нужно добавить в объект PowerShell.Как добавить свойства к объекту PowerShell из массива

У меня нет вопросов, не создания и отображения объекта, как это с помощью New-Object и Add-Member:

$obj = New-Object PSObject 
$obj | Add-Member NoteProperty IName($fiel.IName) 
$obj | Add-Member NoteProperty SName($fiel.SName) 
$obj | Add-Member NoteProperty Taggy($fiel.Taggy) 
$obj | Add-Member NoteProperty Title($fiel.Title) 

Write-Output $obj 

Enter image description here

Но когда я пытаюсь что-то вроде этого:

for ($k=0; $k -lt $fieldsArray.Count; $k++) 
{ 
    $itemobj | Add-Member –MemberType NoteProperty –Name $fieldsArray[$k].InternalName –Value $itemki[$j][$fieldsArray[$k].InternalName] 
    #Write-Host $k 
    #Write-Host $fieldsArray[$k].InternalName.ToString() 
    #Write-Host $itemki[$j][$fieldsArray[$k].InternalName] 
} 

Write-Output $itemobj 

от записи Вывод $ itemobj возвращает только один элемент свойства, который должен быть добавлен без каких-либо опрятных имен столбцов.
Прокомментированные части были добавлены для целей тестирования и вернули правильные значения для всех элементов.

Я также попытался

$itemobj | Add-Member NoteProperty $fieldsArray[$k].InternalName.ToString()($fieldsArray[$k].InternalName) 

без каких-либо улучшений.

Почему другие участники не добавлены?

У меня есть данные, которые мне нужны. Если я пишу:

for ($k=0; $k -lt $fieldsArray.Count; $k++) 
{ 
    Write-Host $k 
    Write-Host $fieldsArray[$k].InternalName.ToString() 
    Write-Host $itemki[$j][$fieldsArray[$k].InternalName] 
} 

я получаю:

ID 1
ContentTypeId 0x0108007345CD807822EA4E85691E5C642F3A27
ТипСодержимого
Название Task0
Изменено 24.11.2012 12:29:30 PM

И это именно те значения, которые я ожидаю и хочу. Проблема заключается в добавлении их в качестве свойств объекта. Я думаю, что у меня не может быть переменной как NotePropertyName, но это дикое предположение, основанное на результатах, которые я получаю.

Некоторые из значений в $ itemki [$ j] [$ fieldsArray [$ k] .InternalName] пусты - не так ли?

Забудьте все массивы. Они были предназначены только для контекста:

Write-Host $fieldsArray[$k].InternalName.ToString() # Writes out the correct value 
Write-Host $itemki[$j][$fieldsArray[$k].InternalName] # writes out the correct value 
$itemobj | Add-Member NoteProperty $fieldsArray[$k].InternalName.ToString()($fieldsArray[$k].InternalName) # The values/property are not added 

Вопрос: ПОЧЕМУ? Существуют ли какие-либо ограничения в Add-Member при передаче значений в качестве переменных? Пустые значения?

+3

В фрагментах кода отсутствуют данные, поэтому трудно понять, чего вы пытаетесь достичь. Пожалуйста, рассмотрите публикацию [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). – vonPryz

+0

Это, по-видимому, проблема в том, что вы используете разные наборы параметров. В первом примере вы используете 'NotePropertySingleMemberSet', а во втором вы используете' MemberSet'. – Matt

+0

Если бы у нас были некоторые данные примера, мы могли бы рассказать вам, что не так. Вы не показываете нам, где объявлены '$ j' или' $ itemobj', но я предполагаю, что мы могли бы предположить – Matt

ответ

7

Я до сих пор не уверен, но если вы просто сосредоточены на Add-Member, то рассмотрите следующее.

$fieldsarray = "ID", "ContentTypeID", "ContentType", "Title", "Modified" 
$itemki = "1", "0x0108007345CD807822EA4E85691E5C642F3A27", "", "Task0", "11/24/2014 12:29:30 PM" 
$itemobj = New-Object pscustomobject 
for($k=0;$k -lt $fieldsArray.Count ; $k++) 
{ 
    $itemobj | Add-Member NoteProperty $fieldsarray[$k] $itemki[$k] 
} 

$itemobj 

Обратите внимание на запись пустой строки в массиве $itemki. Это будет генерировать результат.

ID   : 1 
ContentTypeID : 0x0108007345CD807822EA4E85691E5C642F3A27 
ContentType : 
Title   : Task0 
Modified  : 11/24/2014 12:29:30 PM 

Измените "" на пустой элемент: "1","0x0108007345CD807822EA4E85691E5C642F3A27",,"Task0","11/24/2014 12:29:30 PM", и вы получите этот результат:

ID   : 1 
ContentTypeID : 0x0108007345CD807822EA4E85691E5C642F3A27 
ContentType : {Task0} 
Title   : 11/24/2014 12:29:30 PM 
Modified  : 

что неправильно. Затем, если вы измените пустой элемент $null ваш выход выглядит так же, как первый:

ID   : 1 
ContentTypeID : 0x0108007345CD807822EA4E85691E5C642F3A27 
ContentType : 
Title   : Task0 
Modified  : 11/24/2014 12:29:30 PM 

Относительно вашего выхода

Вы говорите, что вы получите только последний элемент, когда вы делаете $itemobj вне цикла. Что должно выглядеть $itemobj после каждого прохода? for(;;){} циклы не отправляют данные в выходной поток так же, как это стоит упомянуть ForEach-Object{}.

+2

Надеюсь, вы оставите комментарий о своем решении. Я не думаю, что это был хороший ответ ... по крайней мере, пока. – Matt

2

Не выполняйте цикл For, выполните цикл ForEach-Object. Что-то вроде:

$Object = New-Object PSObject 
$Array | ForEach{ 
    Add-Member -InputObject $Object -NotePropertyName $_[0] -NotePropertyValue $_[1] 
} 

Это должно делать то, что вы ищете, я думаю.

+1

, несмотря на то, что он не решает проблему, он улучшает качество кода. – grisha

+0

. Должен ли быть «' ForEach-Object »в примере кода? –

+0

ОК, в соответствии с [документацией для объекта ForEach-Object] (https://technet.microsoft.com/en-us/library/hh849731.aspx), ForEach (и "'% ')) является псевдонимом, поэтому он не должно иметь никакого значения. Но почему вы говорите: «Не делайте цикл ForEach, выполняйте цикл ForEach-Object»? –

2

Вы можете использовать хеш-таблицу вместо двух массивов. Очень легко создать объект из хеш-таблицы. Вот пример:

$hash = @{ 
    ID   = '1' 
    ContentTypeID = '0x0108007345CD807822EA4E85691E5C642F3A27' 
    ContentType = '' 
    Title   = 'Task0' 
    Modified  = '11/24/2014 12:29:30 PM' 
} 

$Object = New-Object PSObject -Property $hash 

 Смежные вопросы

  • Нет связанных вопросов^_^