Powershell: dynamische Variablen innerhalb von foreach

674
Steven

Ich versuche ein paar Berechnungen für eine dynamische Liste von Benutzern durchzuführen, die ich zum Ausführen einer Suche und zum anonymisierten Zählen der Ergebnisse verwenden und dann zu einer laufenden Summe pro Benutzer hinzufügen werde. So zum Beispiel:

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

Wenn die Variable erstellt wurde, benötige ich sie für weitere Schleifen, in denen ich der bereits in der Variablen gespeicherten Zahl eine Zählung hinzufüge.

Und nein, ich kann die $ user-Variable nicht verwenden, da sie nach dem Ende der foreach-Schleife bestehen bleiben muss.

Die Frage ist also, wie ich diese inkrementierende Variable generieren kann, ohne die Begrenzung der Anzahl möglicher Objekte zu kennen.

---BEARBEITEN---

Ein einfaches Beispiel hinzufügen, worüber ich spreche ...

Nach Feedback schaue ich mir Hashtables an, kann aber immer noch nicht herausfinden, wie ich referenzieren soll.

Stellen Sie sich ein Würfelspiel zwischen einer dynamischen Liste von Personen mit mehreren Runden vor. Ich möchte pro Runde ihre Gesamtsumme erhöhen. Mein Problem ist die letzte Zeile, in der ich versuche, die Gesamtsumme mit der Rolle zu aktualisieren. Wie verweise ich auf den Wert der Hashtabelle?

[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
Sie müssen die var nicht vorher in PS deklarieren. Sie sollten jedoch auch den variablen Geltungsbereich untersuchen, der Probleme mit Ihrer aktuellen Vorgehensweise verursachen wird. music2myear vor 6 Jahren 1
Ich muss eigentlich vorher deklarieren, da ich später mehrere Schleifen haben werde, die hinzugefügt werden können, sodass ich nicht einfach eine Variable innerhalb der Schleife verwenden kann. Verstehe auch die Bedenken bezüglich des Umfangs, und ich werde mich damit befassen. Ich suche nur, wie ich die Variable so erstellen kann, dass ich sie später lesen kann ... Steven vor 6 Jahren 0
Solange Sie weiterhin mit $ Script: var_name auf die Variablen verweisen, können Sie sie im gesamten Skript, in einer beliebigen Schleife oder Funktion bearbeiten. Wenn dies nicht das ist, was Sie fragen, können Sie vielleicht klarstellen? music2myear vor 6 Jahren 0
Sie können Variablen mit dem Cmdlet "New-Variable" erstellen. Da die for-Schleife keinen neuen Geltungsbereich einführt, sind sie standardmäßig in folgenden Schleifen im aktuellen Gültigkeitsbereich verfügbar. Sie können den gewünschten Bereich auch als Parameter für das Cmdlet "New-Variable" angeben. Wenn Sie jedoch keine gute Begründung für die Verwendung von Variablen mit dynamischen Namen geben können, sollten Sie stattdessen Array verwenden. PetSerAl vor 6 Jahren 2

1 Antwort auf die Frage

0
maoizm

in deinem Beispiel wäre es $ptotal["player$y"] += $roll

Sie können Hashtables sowohl als assoziative Arrays als auch für Objekte verwenden. Sehr gute Lektüre über sie ist https://kevinmarquette.github.io/2016-11-06-powershell-hashtable-everything-you-wanted-to-know-about/ (natürlich zusätzlich zur offiziellen Dokumentation)

Das ist es! Vielen Dank!!! Steven vor 6 Jahren 0
@Steven sind Sie herzlich willkommen. Sie können "Vote up" als Ausdruck der Dankbarkeit verwenden;) maoizm vor 6 Jahren 0
@maoizm "Vote up" erfordert 15 Punkte, OP jedoch nur 3. PetSerAl vor 6 Jahren 1