Словари называются 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..5
→ 2,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"
Великого объяснение и подробно, спасибо! –
Отличный обзор; стоит упомянуть: ключи hashtable-literal требуют только цитирования, если они содержат пробелы или метасимволы. – mklement0
Стоит также отметить, что '$ dictionary.Add (" foo ", 42)' vs '$ d ['bar'] = 42' ведет себя по-другому, потому что это совсем другие вещи. –