Powershell: динамические переменные внутри foreach

463
Steven

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

$users = Get-ADUser -filter blah [int]$usercount = $users.count  for ($z=1; $z -le $usercount; $z++) { **** create variable here - $user$z *** } 

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

И нет, я не могу использовать переменную $ user, потому что она должна сохраняться после завершения цикла foreach.

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

---РЕДАКТИРОВАТЬ---

Добавляя простой пример того, о чем я говорю ...

После обратной связи я смотрю на хеш-таблицы, но все еще не могу понять, как ссылаться.

Представьте себе игру в кости между динамическим списком людей с несколькими раундами. Я хочу увеличить за раунд их общее количество. Моя проблема - последняя строка, где я пытаюсь обновить итоговую сумму с помощью списка. Как я могу ссылаться на значение хеш-таблицы?

[CmdletBinding()]  param ( [parameter(Mandatory=$false)][ValidateRange(1, [int32]::MaxValue)][int]$rounds = "15", [parameter(Mandatory=$false)][ValidateRange(1, [int32]::MaxValue)][int]$players = "2" )  $ptotal = [ordered]@{} for ($w=1; $w -le $players; $w++) { $ptotal.add("player$w", 0) }  for ($z=1; $z -le $rounds; $z++) { Write-Host Round $z  for ($y=1; $y -le $players; $y++) {  $roll = (1..6 | get-random) + (1..6 | get-random) $ptotal.player$y = $ptotal.player$y + $roll } } 
0
Нет необходимости заранее объявлять переменную в PS. Но вы также должны исследовать переменную область, которая вызовет проблемы с тем, как вы идете сейчас. music2myear 5 лет назад 1
Я действительно должен объявить заранее, потому что позже у меня будет несколько циклов, которые будут добавлены, поэтому я не могу просто использовать переменную внутри цикла. Также поймите, что касается области видимости, и я буду иметь дело с этим, я просто ищу, как создать переменную таким образом, чтобы я мог прочитать ее позже ... Steven 5 лет назад 0
Пока вы продолжаете ссылаться на переменные, используя $ Script: var_name, вы можете манипулировать ими по всему сценарию, в любом цикле или функции. Если это не то, что вы спрашиваете, возможно, вы можете уточнить? music2myear 5 лет назад 0
Вы можете создавать переменные с помощью командлета New-Variable. Поскольку цикл `for` не вводит новую область видимости, они будут доступны в следующих циклах в текущей области видимости по умолчанию. Вы также можете указать желаемую область в качестве параметра для командлета `New-Variable`. Но, если вы не можете дать хорошее обоснование для использования переменных с динамическими именами, вы должны рассмотреть вместо этого использование массива. PetSerAl 5 лет назад 2

1 ответ на вопрос

0
maoizm

в вашем примере это будет $ptotal["player$y"] += $roll

Вы можете использовать Hashtables как ассоциативные массивы и объекты. Очень хорошая информация о них - https://kevinmarquette.github.io/2016-11-06-powershell-hashtable-everything-you-wanted-to-know-about/ (конечно же, поверх официальной документации)

Вот и все! Спасибо!!! Steven 5 лет назад 0
@ Стивен, пожалуйста. Вы можете использовать «Проголосовать» в качестве выражения благодарности;) maoizm 5 лет назад 0
@maoizm "Голосовать" требуют 15 баллов, но у ОП только 3. PetSerAl 5 лет назад 1