2016-10-21 3 views
1

В VBScript я могу сделать что-то вроде этогоPowerShell словарь массивов?

Set objDict = CreateObject("Scripting.Dictionary") 
objDict.Add "item1", Array("data1", "data2") 
objDict.Add "item2", Array("data3", "data4") 

Тогда я могу сделать поиск, используя что-то вроде этого

dataArray = objDict.Item("item2") 
elem1 = dataArray(0) 
elem2 = dataArray(1) 

результат elem1 содержит «Data3» и elem2 содержит «Data4»

Я не уверен, как копировать это в PowerShell. Кто-нибудь поможет?

ответ

5

Словари называются hashtables в PowerShell. Когда PowerShell впервые вышел, Microsoft также выпустила VBScript-to-PowerShell Conversion Guide, охватывая dictionaries и arrays среди прочего.

Вы определяете HashTables (словари), как это:

$d = @{ 
    'foo' = 'something' 
    'bar' = 42 
} 

В качестве альтернативы –, например, если вам необходимо заполнить Хеш динамически – вы можете создать пустой хэш-таблицы и добавить элементы к ней, как это:

$d = @{} 
$d.Add('foo', 'something') 
$d.Add('bar', 42) 

или как это:

$d = @{} 
$d['foo'] = 'something' 
$d['bar'] = 42 

Обычно я предпочитаю последнее, потому что он заменяет существующие ключи, а не бросает ошибку.

$d1 = @{} 
$d1.Add('foo', 23) 
$d1.Add('foo', 42) # can't add another key with same name => error 

$d2 = @{} 
$d2['foo'] = 23  # key is automatically added 
$d2['foo'] = 42  # replaces value of existing key 

Массивы определяются как простой список разделенных запятыми:

$a = 'a', 'b', 'c' 

При желании вы можете также использовать array subexpression operator:

$a = @('a', 'b', 'c') 

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

Оба массива и Hashtable элементы могут быть доступны через index operator ([]):

$d['foo'] # output: "something" 
$a[1]  # output: "b" 

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

$d.foo  # output: "something" 

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

$dict = @{ 
    'item1' = 'data1', 'data2' 
    'item2' = 'data3', 'data4' 
} 

$dataArray = $dict['item2'] 
$elem1 = $dataArray[0] 
$elem2 = $dataArray[1] 

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

$elem1, $elem2 = $dict['item2'] 

Если массив имеет больше элементов, чем число переменных на левой стороне выполнения задания, последняя переменная принимает оставшуюся часть массива:

$x, $y, $z = 'a', 'b', 'c', 'd' 
# $x -> 'a' 
# $y -> 'b' 
# $z -> @('c', 'd') 

$x, $y, $z = 'a', 'b' 
# $x -> 'a' 
# $y -> 'b' 
# $z -> $null 

оператор индекс позволяет получить доступ к нескольким элементам:

$a = 'a', 'b', 'c', 'd', 'e' 
$a[1,3,4] # output: "b", "d", "e" 

, а также элементы из конца массива:

$a = 'a', 'b', 'c', 'd', 'e' 
$a[-1] # output: "e" 
$a[-2] # output: "d" 

И range operator (..) позволяет получить кусочек из массива, просто указав первый и последний индекс. Он производит список чисел, начиная с первого операнда и заканчивая вторым операндом (например, 2..52,3,4,5).

$a = 'a', 'b', 'c', 'd', 'e' 
$a[1..3] # equivalent to $a[1,2,3], output: "b", "c", "d" 
$a[-1..-3] # equivalent to $a[-1,-2,-3], output: "e", "d", "c" 
+0

Великого объяснение и подробно, спасибо! –

+1

Отличный обзор; стоит упомянуть: ключи hashtable-literal требуют только цитирования, если они содержат пробелы или метасимволы. – mklement0

+0

Стоит также отметить, что '$ dictionary.Add (" foo ", 42)' vs '$ d ['bar'] = 42' ведет себя по-другому, потому что это совсем другие вещи. –

1

Другим решением, вы можете использовать System.Collections.Generic.Dictionary так:

#for create your dictionary 
$mydico = New-Object 'System.Collections.Generic.Dictionary[string,string]' 

#For add element into your dictionary 
$mydico.Add("mykey1", "myvalue1") 
$mydico.Add("mykey2", "myvalue2") 

#for get value by key 
$value = $mydico["mykey1"] # $value has myvalue1 like value 
Смежные вопросы