Итерация по нескольким массивам в сценарии powershell - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь использовать несколько массивов для передачи нескольких имен серверов и, возможно, других элементов, которые могут понадобиться в сочетании друг с другом для набора параметров функции в функции Powershell. При использовании одного l oop, если это даже возможно.

Я хотел написать сценарий этого процесса, чтобы вы могли передать массив через параметр в качестве функции большего размера для 2-й функции, но использовать массивы. Вместо вложенной Hashtable.

Это похоже на то, что я пытался сделать, но я не могу заставить массивы передавать каждый элемент по одному для каждого соответствующего массива.

Это то, что я получил, чтобы получить «похожий» результат, но я не буду работать, если мне потребуется индексная позиция через [0] .

$servers1 = @('serv1-01','serv1-02')
$servers2 = @('serv2-01','serv2-02')

$collectionItems = @()
    $temp = New-Object System.Object
    $temp | Add-Member -MemberType NoteProperty -Name "Server1" -Value $servers1
    $temp | Add-Member -MemberType NoteProperty -Name "Server2" -Value $servers2
    $collectionItems += $temp
Write-Host "Server1 is $($item.Server1[0]) and Server2 is $($item.Server2[0])"

foreach ($item in $collectionItems)
{
    Write-Host "Server1 is $($item.Server1) and Server2 is $($item.Server2)"
}


#### This is the output if you run the above script#####
Server1 is serv1-01 and Server2 is serv2-01
Server1 is serv1-01 serv1-02 and Server2 is serv2-01 serv2-02

Ниже приведен вид скелет того, что я пытаюсь выполнить sh ... Я знаю, что у вас может быть вложенная Hashtable, которая использует одну из пар Key: Value в качестве массива, но я не уверен, что вы можете передать это в командной строке как вложенная Hashtable или как это будет работать, чтобы использовать параметры для добавления во вложенные разделы Hashtable против поддержания этой хеш-таблицы в актуальном состоянии ((что не было бы идеально))

Я знаю код ниже не будет работать, но это лучшее визуальное представление моей желаемой конечной цели

function Bigger-ServerListAdding { 
#List of servers to add some config too
$servers1 = @('serv1-01','serv1-02')
$servers2 = @('serv2-01','serv2-02')

#This variable can be passed in and fixed with a -join ',' as a comma separated list
$componentlist = @('sister','brother','uncle','mom','dad')


###This section should do each element not the entire array list being passed###
foreach (item in $somecollection){
 Set-TheseServersOnaConfig -Server1 $item.servers1 -Server2 $item.servers2 -ComponentList $($componentlist -join ",")
}


}

Имейте в виду, это как второй вопрос, который я когда-либо задавал о StackOverflow. Любые предложения, как этот тип вещи в будущем.

Большое спасибо!

1 Ответ

0 голосов
/ 14 февраля 2020

Обработка многомерных массивов в Powershell довольно паршивая, и я стараюсь не использовать их при любой возможности. Ответ Джавада в комментариях о создании массива HashTables - это один из способов избежать их использования, но он не использует преимущества объектно-ориентированной природы PowerShell. В качестве примера я хочу передать информацию о 3 компьютерах, их именах, размере HD и объеме памяти. Используя решение HashTable, вы получаете:

$Array = @()
$Array += @{Computer='star';HD='2TB';Memory='16GB'}
$Array += @{Computer='comet';HD='1TB';Memory='8GB'}
$Array += @{Computer='meteor';HD='3TB';Memory='16GB'}

Этот массив содержит 3 элемента:

PS> $Array.Count
3

И вы можете получить доступ к данным так, как вы ожидаете:

PS> $Array[1]['Computer']
comet

Но вы также можете обращаться к нему как к свойству.

PS> $Array[1].Computer
comet

Но, когда вы перечисляете содержимое, данные смешиваются, и их нелегко понять:

PS> $Array
Name                           Value                                                                                                  
----                           -----                                                                                                  
Memory                         16GB                                                                                                   
HD                             2TB                                                                                                    
Computer                       star                                                                                                   
Memory                         8GB                                                                                                    
HD                             1TB                                                                                                    
Computer                       comet                                                                                                  
Memory                         16GB                                                                                                   
HD                             3TB                                                                                                    
Computer                       meteor        

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

PS C:\Users\Matthew> $Array[0] | gm

   TypeName: System.Collections.Hashtable

Name              MemberType            Definition                                                                                    
----              ----------            ----------                                                                                    
Add               Method                void Add(System.Object key, System.Object value), void IDictionary.Add(System.Object key, S...
Clear             Method                void Clear(), void IDictionary.Clear()                                                        
Clone             Method                System.Object Clone(), System.Object ICloneable.Clone()                                       
Contains          Method                bool Contains(System.Object key), bool IDictionary.Contains(System.Object key)                
ContainsKey       Method                bool ContainsKey(System.Object key)                                                           
ContainsValue     Method                bool ContainsValue(System.Object value)                                                       
CopyTo            Method                void CopyTo(array array, int arrayIndex), void ICollection.CopyTo(array array, int index)     
Equals            Method                bool Equals(System.Object obj)                                                                
GetEnumerator     Method                System.Collections.IDictionaryEnumerator GetEnumerator(), System.Collections.IDictionaryEnu...
GetHashCode       Method                int GetHashCode()                                                                             
GetObjectData     Method                void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Seri...
GetType           Method                type GetType()                                                                                
OnDeserialization Method                void OnDeserialization(System.Object sender), void IDeserializationCallback.OnDeserializati...
Remove            Method                void Remove(System.Object key), void IDictionary.Remove(System.Object key)                    
ToString          Method                string ToString()                                                                             
Item              ParameterizedProperty System.Object Item(System.Object key) {get;set;}                                              
Count             Property              int Count {get;}                                                                              
IsFixedSize       Property              bool IsFixedSize {get;}                                                                       
IsReadOnly        Property              bool IsReadOnly {get;}                                                                        
IsSynchronized    Property              bool IsSynchronized {get;}                                                                    
Keys              Property              System.Collections.ICollection Keys {get;}                                                    
SyncRoot          Property              System.Object SyncRoot {get;}                                                                 
Values            Property              System.Collections.ICollection Values {get;}                                                  

Однако, если вы должны были воспользоваться преимуществами объектной природы PowerShell и вместо HashTables использовать пользовательский объект PowerShell (тип [PSCustomObject]), который резко меняется. Вы можете создать новый объект разными способами, но вы можете проверить этот Te chNet Article PowerShell: Создание пользовательских объектов для нескольких из них. Я собираюсь использовать мой личный фаворит, который очень похож на метод HashTable, так как он использует HashTable для определения параметров объекта:

$Array = @()
$Array += [PSCustomObject]@{Computer='star';HD='2TB';Memory='16GB'}
$Array += [PSCustomObject]@{Computer='comet';HD='1TB';Memory='8GB'}
$Array += [PSCustomObject]@{Computer='meteor';HD='3TB';Memory='16GB'}

Это дает вам те же 3 элемента в массиве:

PS> $Array.Count
3

Поскольку данные не в формате HashTable, вы не можете обращаться к ним как к HashTable, но вы можете обращаться к ним как к свойству:

PS> $Array[1]['Computer']

PS> $Array[1].Computer
comet

Но что вы получаете является то, что данные хранятся отдельно в отдельных объектах:

PS> $Array

Computer HD  Memory
-------- --  ------
star     2TB 16GB  
comet    1TB 8GB   
meteor   3TB 16GB  

И определение объекта красиво и аккуратно:

PS> $Array[0] | gm

   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition                    
----        ----------   ----------                    
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()             
GetType     Method       type GetType()                
ToString    Method       string ToString()             
Computer    NoteProperty string Computer=star          
HD          NoteProperty string HD=2TB                 
Memory      NoteProperty string Memory=16GB            

Я надеюсь, что это поможет вам лучше понять, как PowerShell обрабатывает данные и помогает вам сделать правильный выбор, как хранить ваши данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...