Powershell: ตัวแปรแบบไดนามิกภายใน foreach


0

ฉันกำลังพยายามคำนวณทางคณิตศาสตร์สำหรับรายการแบบไดนามิกของผู้ใช้ที่ฉันจะใช้เพื่อเรียกใช้การค้นหาและนับผลลัพธ์บางอย่างโดยไม่ระบุชื่อ ตัวอย่างเช่น:

$users = Get-ADUser -filter blah
[int]$usercount = $users.count

for ($z=1; $z -le $usercount; $z++) {
    **** create variable here - $user$z ***
}

เมื่อสร้างตัวแปรฉันต้องการให้มีลูปเพิ่มเติมโดยที่ฉันจะเพิ่มจำนวนลงในหมายเลขที่เก็บไว้ในตัวแปรแล้ว

และไม่ฉันไม่สามารถใช้ตัวแปร $ user ได้เพราะจะต้องคงอยู่หลังจากลูป foreach นี้สิ้นสุด

ดังนั้นคำถามคือฉันจะสร้างตัวแปรที่เพิ่มขึ้นโดยไม่ทราบจำนวน จำกัด ของวัตถุที่เป็นไปได้อย่างไร

--- แก้ไข ---

การเพิ่มตัวอย่างง่ายๆของสิ่งที่ฉันกำลังพูดถึง ...

หลังจากข้อเสนอแนะฉันกำลังดูแฮชเทเบิล แต่ก็ยังหาวิธีอ้างอิงไม่ได้

ลองนึกภาพเกมลูกเต๋าระหว่างรายชื่อผู้คนที่มีหลายรอบ ฉันต้องการเพิ่มขึ้นต่อรอบทั้งหมดของพวกเขา ปัญหาของฉันคือบรรทัดสุดท้ายที่ฉันพยายามอัพเดตผลรวมด้วยการหมุน ฉันจะอ้างอิงค่า hashtable ได้อย่างไร

[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
    }
}

1
ไม่จำเป็นต้องประกาศ var ล่วงหน้าใน PS แต่คุณควรศึกษาขอบเขตตัวแปรซึ่งจะทำให้เกิดปัญหากับวิธีที่คุณกำลังทำอยู่ตอนนี้
music2myear

ฉันต้องประกาศล่วงหน้าเพราะฉันจะมีหลายลูปในภายหลังที่จะเพิ่มดังนั้นฉันจึงไม่สามารถใช้ตัวแปรภายในลูปได้ เข้าใจถึงขอบเขตของความกังวลและจะจัดการกับสิ่งนั้นฉันแค่มองหาวิธีสร้างตัวแปรในแบบที่ฉันสามารถอ่านได้ในภายหลัง
Steven

ตราบใดที่คุณยังคงอ้างอิง vars โดยใช้ $ Script: var_name คุณสามารถจัดการมันได้ตลอดทั้งสคริปต์ในลูปหรือฟังก์ชัน หากนี่ไม่ใช่สิ่งที่คุณขอบางทีคุณสามารถชี้แจงได้
music2myear

2
คุณสามารถสร้างตัวแปรด้วย New-Variable cmdlet เช่น for วนรอบไม่ได้แนะนำขอบเขตใหม่จะมีให้ในลูปต่อไปนี้ในขอบเขตปัจจุบันตามค่าเริ่มต้น คุณสามารถระบุขอบเขตที่ต้องการเป็นพารามิเตอร์ได้ New-Variable cmdlet เช่นกัน แต่ถ้าคุณไม่สามารถให้เหตุผลที่ดีสำหรับการใช้ตัวแปรที่มีชื่อแบบไดนามิกคุณควรพิจารณาใช้อาร์เรย์แทน
PetSerAl

คำตอบ:


0

ในตัวอย่างของคุณมันจะเป็น $ptotal["player$y"] += $roll

คุณสามารถใช้แฮชเทเบิลได้ทั้งในอาเรย์และวัตถุ อ่านดีมากเกี่ยวกับพวกเขาคือ https://kevinmarquette.github.io/2016-11-06-powershell-hashtable-everything-you-wanted-to-know-about/ (ด้านบนของเอกสารอย่างเป็นทางการของหลักสูตร)


@Steven คุณยินดีต้อนรับ คุณสามารถใช้ "โหวต" เพื่อแสดงความขอบคุณ;)
maoizm

1
@maoizm "โหวต" ต้องการ 15 คะแนน แต่ OP มี 3 เท่านั้น
PetSerAl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.