Доступ к нескольким выводам из скрипта по символическим именам (ключам) - PullRequest
0 голосов
/ 04 марта 2019

Я новичок в сценариях PowerShell, я хочу иметь возможность различать выходные данные сценария.Давайте возьмем в качестве примера этот скрипт test.ps1:

param([System.String] $w)
$x=$w+" is correct"
$y=$w+ " is false"
$x
$y

, чтобы выполнить его и получить значения $ x & $ y, я делаю это:

$a=.\test1.ps1 -w test
$a[0] #this is x
$a[1] # this is y

естьКак мы можем использовать что-то похожее на $ ax для получения значения $ x?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Полезный ответ AdminOfThings показывает один подход к предоставлению доступа к значениям на основе ключей: [pscustomobject].

В общих чертах вы ищетедля словаря или хеш-таблицы (хеш-таблица): набор пар ключ-значение, которые обеспечивают эффективный поиск значения по связанному ключу.

Фактически, метод [pscustomobject] в связанном ответе синтаксически основан на синтаксисе хэш-таблицы PowerShell , @{ <key> = <value>; ... } [1] .

Примердля краткости используйте блок скрипта ({ ... }) вместо скрипта / функции:

$output = & { 
  # Output a hashtable
  @{ x = 'one'; y = 'two' } 
}

# Access the entries by key:

# Index syntax:
$output['x'] # -> 'one'
$output['y'] # -> 'two'

# Dot notation, as with objects, works too.
# While this is convenient, it is much slower with variable-based keys;
# e.g., $output.$keyName - this typically won't matter, but may in loops
# with a high number of iterations.
$output.x # -> 'one'
$output.y # -> 'two'

Если порядок, в котором перечисляются записи, имеет значение, используйте упорядоченную хеш-таблицу (PSv3 +): [ordered] @{ <key> = <value>; ... }.
Вы платите только незначительное снижение производительности за использование упорядоченной хеш-таблицы, поэтому я предлагаю использовать [ordered] по привычке, так как это обеспечивает более приятный вывод и отладкучтобы увидеть записи в том же порядке, в котором они были определены.


Выбор между [pscustomobject] и хеш-таблицей:

  • Если вы представляете выход как один объект со значениями, хранящимися вСвойства, используйте [pscustomobject], но обратите внимание, что создание объекта медленнее, чем создание хеш-таблицы.

  • Если выходные данные являются просто набором пар ключ-значение, используйте (n упорядоченный) hashtable.

Если производительность имеет значение (в циклах с большим количеством итераций):

  • Использование (заказано) hashtables .

  • Использовать индексный доступ с не-литеральными ключами (например, $key = 'one'; $ht[$key]), что намного быстрее, чем запись с не-литеральными точками(например, $key = 'one'; $ht.$key)


[1] Обратите внимание, однако, что [pscustomobject] @{ ... } является синтаксическим сахаром в этом пользовательском объекте непосредственно построено - промежуточная хеш-таблица не создается;кроме того, свойства, определяемые ключами хеш-таблицы, определены в порядок определения , тогда как хеш-таблица не гарантирует какого-либо конкретного упорядочения своих записей, если вы не используете [ordered] @{ ... }.

0 голосов
/ 04 марта 2019

Чтобы сделать то, что вы хотите, вам понадобится объект, который содержит пару ключ / значение или именованные свойства.Например, вы можете создать объект с именем a со свойствами x и y:

$x = "one"
$y = "two"
$a = [pscustomobject]@{"x"=$x;"y"=$y}

Проверка вышеприведенного случая:

$a

x   y
-   -
one two

$a.x
one
$a.y
two

Мне нравится ссылка PSCustomObjects для объяснения создания и использования пользовательских объектов.

Тестирование с помощью функции:

function test {

param([string] $w)

$x = $w + "x"
$y = $w + "y"

[pscustomobject]@{"x"=$x; "y"=$y}
}

$a = test "my property "
$a

x             y
-             -
my property x my property y


$a.x
my property x
$a.y
my property y
...