2015-10-27 4 views
2

Кажется, что это должно быть очень просто, но я не могу понять, как это сделать.Создание пользовательских объектов PowerShell из нескольких переменных

Как создать пользовательские объекты PowerShell из нескольких переменных/строк?

У меня есть 3 переменных, как показано ниже.

$name = @' 
Bob 
Kate 
John 
'@ 

$age = @' 
35 
12 
57 
'@ 

$gender = @' 
Male 
Female 
Male 
'@ 

Как преобразовать его в объект PowerShell, как показано ниже?

Выход

name age gender 
---- --- ------ 
bob 35 male 
kate 12 female 
john 57 male 

ответ

0

Вы первый разбить все строки в массивы, а затем перебирать один массив по индексу и создавать переменные через new-object psobject и $object|add-member -type noteproperty. Обратите внимание: сначала вы должны иметь структуру данных этого типа, иначе пропущенный или добавленный CRLF может испортить ваши данные.

$arrname=$name.split("`r`n") 
$arrage=$age.split("`r`n") 
$arrgender=$gender.split("`r`n") 
foreach ($i in 0..($arrname.length-1)) { 
    $ob=new-object psobject 
    $ob | add-member -type noteproperty -name "Name" -value $arrname[$i] 
    # add other fields similarly 
    $ob 
} 
+0

При запуске кода вы получаете ** индексное выражение массива отсутствует или недействителен. ** – Ishan

+0

Почему добавлять пустые строки между значениями. – Ishan

+0

@Ishan Вот как работает «Format-Table». Вы не должны использовать исходный вывод для обработки данных, и если вам нужно, используйте вместо него «Format-List». – Vesper

0

Вы можете попробовать это, я не очень этому горжусь, но он выполняет эту работу.

$psobj = ($name.Split("`n")) | % {[PSCustomObject]@{name=$_}} | % {$n=0}{Add-Member -Name "age" -InputObject $_ -MemberType NoteProperty -Value $($age.Split("`n"))[$n];Add-Member -Name "gender" -InputObject $_ -MemberType NoteProperty -Value $($gender.Split("`n"))[$n];$n++;$_} 

Я создаю объект только с именем и использую Add_Member для добавления других участников.

+0

Почему он добавляет ... к выходу объекта PowerShell. – Ishan

+0

@ Ishan Я создаю объект с именем и использую Add_Member для добавления других участников. – JPBlanc

+0

@ Ишан может быть, что ваши разрывы строк состоят из '' '' '' '' '', а не просто '' 'n' '. Вы можете использовать 'name = $ _. Trim()' вместо 'name = $ _', чтобы убедиться, что удаленные пробелы удалены –

0

Это работает, но, как указано ранее, ваши данные должны быть отформатированы отлично. Мне пришлось бросить на .trim(), чтобы избавиться от некоторых белых пространств.

$name = @' 
Bob 
Kate 
John 
'@ 

$age = @' 
35 
12 
57 
'@ 

$gender = @' 
Male 
Female 
Male 
'@ 
$myNames = $name.Split("`n").Trim() 
$myAges = $age.Split("`n").Trim() 
$myGenders = $gender.Split("`n").Trim() 

$myArray = @() 

for ($i = 0; $i -lt $mynames.count; $i++) 
{ 
    $myObj = "" | select Name,Age,Gender 
    $myObj.Name = $myNames[$i] 
    $myObj.Age = $myAges[$i] 
    $myobj.Gender = $myGenders[$i] 

    $myArray += $myObj 

} 
$myArray 
Смежные вопросы