PDA

Показать полную графическую версию : [решено] Создание переменной (коллекции) с несколькими значениями


rudimko
16-01-2014, 10:20
Друзья, подскажите, как создать переменную с несколькими значениями, что бы их было 4-5 или больше? Умею создавать только хэштейбл ($var = @{a=1;b=2;}), но там только (2 значения) Name и Value... Спасибо.

Kazun
16-01-2014, 10:58
Вопрос непонятен. Если требуется создать объект с заданными свойствами, то можно воспользоваться например(так методов много):
1)
$Object = New-Object PSObject
$Object | add-member Noteproperty a1 1
$Object | add-member Noteproperty a2 2
$Object | add-member Noteproperty a3 3
$Object | add-member Noteproperty a4 4
$Object | add-member Noteproperty a5 5

2)
$Object = New-Object PSObject -Property @{
a1 = 1
a2 = 2
a3 = 3
a4 = 5
a5 = 5
}

3)
$Object = "" | Select @{n="a1";e={1}},@{n="a2";e={2}},@{n="a3";e={3}},@{n="a4";e={4}},@{n="a5";e={5}}

4) Для PowerShell v3 и выше:
$Object = [pscustomobject]@{a1=1; a2=2; a3=3; a4=4; a5=5}


https://social.technet.microsoft.com/wiki/contents/articles/7804.powershell-creating-custom-objects.aspx

rudimko
16-01-2014, 12:03
Прошу прощения за тавтологию...

Хочу немного другого результата добиться:

Допустим выполняется цикл в котором создаются переменные и им присваиваются определенные значения:


foreach ($connection in $connections)
{
$SessionID = $connection.SessionID
$infoBase = $connection.infoBase.Name
$MemorySize = $connection.process.MemorySize
$processPID = $connection.process.PID
}


Каждый раз в цикле данным переменным будут присваиваться разные значения.
Мне необходимо создать одну переменную, которая сможет в себе сохранить параметры этих переменных из всего цикла, то есть переменная должна иметь примерно вот такой вид - Name = $SessionID Param1 = $InfoBase Param2 = $MemorySize Param3 = $processPID

Типа такой структуры в переменной:
Name | Param1 | Param2 | Param3

Выглядить в целом примерно так:
Name1 | Base1 | 4123123 | 4321
Name2 | Base2 | 4123123 | 4321
Name3 | Base3 | 4456763 | 6479
...

Моих знаний хватает лишь на 2 значения ;)) например $collection += @{$SessionID = $infoBase;}, вот бы добавить сюда еще 2 нужных ;)

Я так понимаю нужно как-то плюсовать значения переменной в цикле, но как вот построить такую структуру, возможно ли?

Kazun
16-01-2014, 12:55
$con = @()
foreach ($connection in $connections)
{
$con += New-Object PSObject -Property @{
SessionID = $connection.SessionI
infoBase = $connection.infoBase.Name
MemorySize = $connection.process.MemorySize
processPID = $connection.process.PID
}
}

rudimko
16-01-2014, 14:01
Здорово, но есть затык небольшой...

К примеру вывожу переменную: $con | format-list

5860620 : 8132860
4972 : 4940
3222 : 3615
V8_BASE_1 : V8_BASE_2

5860620 : 8132860
4972 : 4940
3222 : 31464
V8_BASE_1 : V8_BASE_3

5860620 : 8132860
4972 : 4940
3222 : 28400
V8_BASE_1 : V8_BASE_3
и тд....

Как задать названия для заголовков правильно? Написал до цикла:

$con += New-Object PSObject -Property @{
$nameSessionID = "SessionID"
$nameInfoBase = "InfoBase"
$nameMemorySize = "MemorySize"
$nameProcessPID = "ProcessPID"
}


Заголовки появились, но первым значением в коллекции переменной идут значения из заголовков, только потом полезные данные.

infoBase : infoBase
processPID : processPID
MemorySize : MemorySize
SessionID : SessionID

infoBase : BASE_4
processPID : 5012
MemorySize : 6979204
SessionID : 3425

Еще вопрос... Можно ли как-то объединить данные в этой переменной, как бы слить, например:
есть несколько одинаковых значений "ProcessPID" и "MemorySize", но значения "InfoBase" и "SessionID" разные, можно ли соединить их? Ну например значение "ProcessPID" и "MemorySize" останется таким же, а "InfoBase" будет сливаться (добавляться) - "V8_BASE_1, V8_BASE_2", так же и "SessionID" - "3615, 107653"

Например, что бы выглядело не так:

infoBase : BASE_4
processPID : 5012
MemorySize : 6979204
SessionID : 3425

infoBase : BASE_1
processPID : 5012
MemorySize : 6979204
SessionID : 7296

infoBase : BASE_3
processPID : 4972
MemorySize : 6381188
SessionID : 107076

infoBase : BASE_2
processPID : 4972
MemorySize : 6381188
SessionID : 8582

infoBase : BASE_1
processPID : 4972
MemorySize : 6381188
SessionID : 1875

infoBase : BASE_1
processPID : 4972
MemorySize : 6381188
SessionID : 1890


А вот так:

infoBase : BASE_4, BASE_1
processPID : 5012
MemorySize : 6979204
SessionID : 3425, 7296

infoBase : BASE_3, BASE_2, BASE_1
processPID : 4972
MemorySize : 6381188
SessionID : 107076, 8582, 1875, 1890


Kazun, спасибо, хэлп.

Kazun
16-01-2014, 15:08
"Название Свойства" = Значение

Я же привел пример выше уже.


$con += New-Object PSObject -Property @{
"SessionID" = $nameSessionID
"InfoBase" = $nameInfoBase
"MemorySize" = $nameMemorySize
"ProcessPID" = $nameProcessPID
}

Можно и сгруппировать:
$con = $con | group ProcessPID | Foreach {
if($_.Count -gt 1) {
New-Object PSObject -Property @{
"SessionID" = ($_.Group | Foreach {$_.SessionID}) -join ","
"InfoBase" = ($_.Group | Foreach {$_.InfoBase}) -join ","
"MemorySize" = ($_.Group | Foreach {$_.MemorySize}) -join ","
"ProcessPID" = $_.Name
}
}
else {
$_.Group
}
}




© OSzone.net 2001-2012