ค้นหาเว็บไซต์

ความแตกต่างระหว่าง ForEach และ ForEach-Object ใน PowerShell


คุณสามารถใช้คำสั่ง ForEach และ ForEach-Object cmdlet ในสคริปต์ PowerShell ของคุณได้ พวกเขาทั้งสองใช้ลูปเพื่อวนซ้ำข้อมูล แต่ลูปเหล่านี้แตกต่างกัน ในบทความนี้ คุณจะได้เรียนรู้ความแตกต่างระหว่าง Foreach และ ForEach-Object ใน PowerShell

ForEach กับ ForEach-Object PowerShell

คุณสามารถใช้คำสั่ง ForEach หรือ ForEach-Object cmdlet ใน PowerShell เพื่อวนซ้ำผ่านคอลเลกชันของวัตถุ ข้อแตกต่างที่ใหญ่ที่สุดคือคุณสามารถใช้คำสั่ง ForEach ที่จุดเริ่มต้นของบรรทัดคำสั่ง PowerShell ได้ ในขณะที่ ForEach-Object cmdlet สามารถใช้ได้หลังจากไปป์ไลน์เท่านั้น

ตารางด้านล่างแสดงความแตกต่างระหว่าง ForEach และ ForEach-Object

Beginning of a command line

หลังจากวางท่อแล้ว

Fast

ช้า

หลังจากอ่านบทความนี้ คุณควรทราบวิธีใช้ ForEach และ ForEach-Object ใน PowerShell หากคุณมีอาร์เรย์อยู่แล้ว ให้ใช้คำสั่ง ForEach หากคุณมีอินพุตไปป์ไลน์และต้องการส่งออกผลลัพธ์ ให้ใช้ ForEach-Object

คำสั่ง PowerShell Foreach

คำสั่ง ForEach ใช้เพื่อวนซ้ำชุดข้อมูล เช่น รายการสินค้า กล่องจดหมาย หรือผู้ใช้

วิธีสร้างอาร์เรย์ใน PowerShell

อาร์เรย์คือชุดของวัตถุ (สมาชิก) โดยปกติแล้ว คุณจะใช้อาร์เรย์เพื่อจัดกลุ่มหรือผูกวัตถุตั้งแต่หนึ่งชิ้นขึ้นไป เมื่อคุณใช้คำสั่ง ForEach คำสั่งนั้นจะอ้างถึงสมาชิกแต่ละคนในอาร์เรย์

ตัวอย่างบางส่วนของวัตถุอาร์เรย์:

  • ผู้ใช้
  • กล่องจดหมาย Exchange Online
  • แถวในไฟล์
  • กระบวนการระบบปฏิบัติการ

อาร์เรย์อาจเป็นวัตถุเฉพาะหรือชุดย่อยของวัตถุเฉพาะก็ได้ ตัวอย่างเช่น กล่องจดหมาย Exchange Online ทั้งหมดเป็นอาร์เรย์ ซึ่งเป็นวัตถุเฉพาะ ถ้าคุณต้องการเฉพาะกล่องจดหมายของผู้ใช้ กล่องจดหมายเหล่านั้นอาจเป็นอาร์เรย์ซึ่งเป็นชุดย่อยของกล่องจดหมาย Exchange Online ได้เช่นกัน

มีวิธีการต่างๆ ที่คุณสามารถใช้เพื่อสร้างอาร์เรย์ได้:

  1. ใช้คำสั่ง PowerShell พื้นฐานและใช้อาร์เรย์ ตัวอย่างเช่น แต่ละ PowerShell cmdlet ที่ขึ้นต้นด้วย รับ
  2. ข้อมูลจากรูปแบบเฉพาะ เช่น ไฟล์ CSV ก็สามารถเป็นอาร์เรย์ได้เช่นกัน เมื่อคุณเปิดไฟล์ CSV ไฟล์จะมีแถวและคอลัมน์ โดยแต่ละ แถว แสดงถึงอาร์เรย์ของสมาชิก แต่ละคอลัมน์แสดงถึงคุณสมบัติของสมาชิก
  3. การใช้ กลุ่ม แท้จริงแล้วคืออาร์เรย์ กลุ่มทำหน้าที่เป็นคอนเทนเนอร์แบบลอจิคัลที่มีสมาชิกกลุ่มซึ่งเป็นอาร์เรย์
  4. หากคุณเขียนสมาชิกแต่ละรายการด้วยตนเองโดยคั่นด้วยอักขระลูกน้ำ คุณจะสร้างอาร์เรย์ของ ผู้ใช้หลายคน ได้ด้วย

ใช้คำสั่ง PowerShell เพื่อสร้างอาร์เรย์

ตามค่าเริ่มต้น เมื่อคุณใช้ รับ PowerShell cmdlet มันจะสร้างอาร์เรย์ เมื่อเราใช้ PowerShell cmdlets เช่น Get-Mailbox เรากำลังขอข้อมูลเกี่ยวกับประเภทออบเจ็กต์ที่เฉพาะเจาะจงมาก ซึ่งได้แก่ กล่องจดหมาย Exchange PowerShell จะสร้างพื้นที่อาร์เรย์โดยอัตโนมัติและเติมที่เก็บอาร์เรย์ด้วยข้อมูลเกี่ยวกับกล่องจดหมาย Exchange ที่มีอยู่ทั้งหมด จากนั้นคุณสามารถส่งออกข้อมูลอาร์เรย์ไปยังไฟล์หรือไปป์ข้อมูลไปยังคำสั่ง PowerShell อื่นได้

ในตัวอย่างของเรา เราจะใช้คุณสมบัติเฉพาะ RecipientTypeDetails หากคุณต้องการรับเฉพาะชุดย่อยหรือกลุ่มของกล่องจดหมาย Exchange Online เช่น กล่องจดหมายของผู้ใช้ คุณจะต้องสร้างอาร์เรย์ เราจะใช้พารามิเตอร์การค้นหา -Filter ในคำสั่ง PowerShell

คำสั่ง PowerShell ด้านล่างจะได้รับรายการกล่องจดหมายของผู้ใช้ทั้งหมดใน Exchange Online

Get-Mailbox -ResultSize Unlimited -Filter { (RecipientTypeDetails -eq "UserMailbox") }

คุณยังสามารถสร้างคำสั่ง PowerShell ด้วยพารามิเตอร์การค้นหา -Filter อื่นได้

อีกตัวอย่างหนึ่งคือการรับรายชื่อผู้ใช้ Exchange Online ทั้งหมด แต่เพิ่มตัวกรองเพื่อรับผู้ใช้จากแผนกไอทีเท่านั้น

Get-User -ResultSize Unlimited -Filter 'Department -eq "IT"'

มาดูวิธีใช้คำสั่ง PowerShell เหล่านี้เป็นอาร์เรย์ในขั้นตอนถัดไป

ใช้ตัวแปร PowerShell เพื่อสร้างอาร์เรย์

ตัวแปรเป็นองค์ประกอบสำคัญที่มักใช้กับคำสั่ง PowerShell ForEach ตัวแปร PowerShell ทำหน้าที่เป็นคอนเทนเนอร์แบบลอจิคัลและจัดเก็บข้อมูลข้อมูลของสมาชิกอาร์เรย์

ทำตามขั้นตอนเหล่านี้เพื่อกำหนดตัวแปร PowerShell:

  • ใช้สัญลักษณ์ $ เพื่อแสดงตัวแปร
  • กำหนดตัวแปร ชื่อ ที่เกี่ยวข้องกับข้อมูล ชื่อตัวแปรไม่คำนึงถึงขนาดตัวพิมพ์ ชื่อตัวแปรสามารถมีช่องว่างและอักขระพิเศษได้ แต่สิ่งเหล่านี้ใช้งานยากและควรหลีกเลี่ยง
  • ใช้คำสั่ง PowerShell รับ เพื่อดึงข้อมูลเกี่ยวกับออบเจ็กต์เฉพาะ ผลลัพธ์จากคำสั่ง PowerShell จะถูกเก็บไว้ในตัวแปร

ตัวอย่างไวยากรณ์ของตัวแปร PowerShell

$ExchangeMailboxes = Get-Mailbox -ResultSize Unlimited

ในตัวอย่างข้างต้น เรามีตัวแปรชื่อ $ExchangeMailboxes ที่เก็บข้อมูลจาก Get-Mailbox PowerShell cmdlet

เมื่อเราเรียกใช้ตัวแปร $ExchangeMailboxes ตัวแปรจะแสดงกล่องจดหมายทั้งหมด

$ExchangeMailboxes

PowerShell ForEach วนซ้ำพร้อมอาร์เรย์

บางครั้งคุณต้องดำเนินการจำนวนมากโดยใช้คำสั่ง PowerShell กับกลุ่มของออบเจ็กต์ (อาร์เรย์)

หากคุณต้องการรันงานบนอาร์เรย์หลายครั้ง วิธีที่ดีที่สุดคือรวมคำสั่ง Foreach เข้ากับ ตัวแปร เพื่อจัดเก็บข้อมูลอาร์เรย์ (สมาชิก)

กำหนดคำสั่ง PowerShell โดยใช้ลูป ForEach พร้อมตัวแปร:

  • ตั้งชื่อ ตัวแปรเพื่อจัดเก็บผลลัพธ์ของคำสั่ง รับ PowerShell
  • เริ่มต้นคำสั่ง ForEach ตามด้วยวงเล็บ ( ) กำหนดชื่อของตัวแปรอื่น เช่น $Member เพื่อแสดงถึงสมาชิกแต่ละตัวในอาร์เรย์
  • คำสั่ง PowerShell เพื่อดำเนินการกับอาร์เรย์จะต้องอยู่ในวงเล็บปีกกา { } เมื่อคุณใช้คำสั่ง ForEach คำสั่งจะดำเนินการคำสั่ง PowerShell แยกกันสำหรับสมาชิกแต่ละคนในอาร์เรย์

ตัวอย่างไวยากรณ์ PowerShell ForEach

$VariableName = Get PowerShell command
ForEach ($Member in $VariableName) {
    #PowerShell command perform the operation
}

เราจะใช้ไวยากรณ์ PowerShell ForEach ข้างต้นในขั้นตอนถัดไป

ใช้ ForEach loop เพื่อระบุวัตถุ Array

อาร์เรย์คือชุดของออบเจ็กต์ เช่น ผู้ใช้หรือสมาชิกทั้งหมด ผู้ใช้แต่ละคนภายในอาร์เรย์นั้นคือสมาชิกอาร์เรย์

เราจะแสดงสองวิธีในการแสดงสมาชิกอาร์เรย์

วิธีที่ 1: ดูสมาชิกอาร์เรย์ที่ต้องการ

ในตัวอย่างของเรา ตัวแปร $ExchangeMailboxes แสดงถึงอาร์เรย์ แต่ตัวแปร $ExchangeMailbox แสดงถึงสมาชิกแต่ละคนในอาร์เรย์

เรียกใช้สคริปต์ PowerShell ด้านล่างเพื่อรับรายการสมาชิกอาร์เรย์ทั้งหมด

$ExchangeMailboxes = Get-Mailbox -ResultSize Unlimited
ForEach ($ExchangeMailbox in $ExchangeMailboxes) {
    $Member
}

หากต้องการดูสมาชิกอาร์เรย์ที่ระบุ คุณสามารถแสดงสิ่งที่เก็บไว้ในตัวแปร $ExchangeMailboxes เรียกใช้คำสั่ง PowerShell ด้านล่างเพื่อดูสมาชิกอาร์เรย์ แรก

$ExchangeMailboxes[0]

ผลลัพธ์ PowerShell แสดงผลลัพธ์ด้านล่าง

Name                      Alias       Database           ProhibitSendQuota    ExternalDirectoryObjectId
----                      -----       --------           -----------------    -------------------------
0de964ae-f09a-4e65-bc8c-… Adam.Mackay EURPR02DG610-db026 99 GB (106,300,440,… 0de964ae-f09a-4e65-bc8c-cbeac2745e4c

เรียกใช้คำสั่ง PowerShell ด้านล่างเพื่อดูสมาชิกอาร์เรย์วินาที

$ExchangeMailboxes[1]

ผลลัพธ์เอาต์พุตของ PowerShell

Name                      Alias       Database           ProhibitSendQuota    ExternalDirectoryObjectId
----                      -----       --------           -----------------    -------------------------
0de964ae-f09a-4e65-bc8c-… Adam.Mackay EURPR02DG610-db026 99 GB (106,300,440,… 0de964ae-f09a-4e65-bc8c-cbeac2745e4c

วิธีที่ 2: ใช้ write-host เพื่อแสดงสมาชิกอาร์เรย์ทั้งหมด

คุณสามารถเพิ่ม write-host ให้กับตัวแปร $member ในบรรทัดที่ 3

เรียกใช้สคริปต์ PowerShell ด้านล่างเพื่อรับรายการสมาชิกอาร์เรย์ทั้งหมด

$ExchangeMailboxes = Get-Mailbox -ResultSize Unlimited
ForEach ($ExchangeMailbox in $ExchangeMailboxes) {
    Write-host "This is one of the array members" -$ExchangeMailbox
}

ผลลัพธ์ของ PowerShell แสดงรายการสมาชิกทั้งหมดที่มีกล่องจดหมาย Exchange Online

This is one of the array members -Adam Mackay
This is one of the array members -Amanda Hansen
This is one of the array members -Blake Martin
This is one of the array members -Brenda Smith
This is one of the array members -Brian Mill
This is one of the array members -Carl Hawk
This is one of the array members -Carol Piper
This is one of the array members -Chris Lucas
This is one of the array members -Diana Baker
This is one of the array members -Frank Olsen
This is one of the array members -Julia Wood
This is one of the array members -Ken Walker
This is one of the array members -Laura Terry
This is one of the array members -Owen Terry
This is one of the array members -Projector 21
This is one of the array members -RoomMail 8
This is one of the array members -Stephen Hunter
This is one of the array members -Stephen Lambert

ระบุตัวตนของสมาชิกอาร์เรย์เฉพาะ

ด้วย PowerShell เราสามารถรับสมาชิกแต่ละคนของอาร์เรย์ได้ แต่ตอนนี้เราต้องการระบุตัวตนของพวกเขา

เมื่อต้องการระบุข้อมูลประจำตัวของสมาชิกแต่ละคนในอาร์เรย์ คุณควรใช้ไวยากรณ์ PowerShell ต่อไปนี้

$ExchangeMailbox.Identity

ตัวแปร $ExchangeMailbox เป็นสมาชิกอาร์เรย์ และ Identity เป็นคุณสมบัติของวัตถุ

มีหลายวัตถุเฉพาะตัวในกล่องจดหมาย Exchange Online พารามิเตอร์ Identity ระบุกล่องจดหมาย Exchange Online และคุณสามารถใช้ค่าใดค่าหนึ่งเหล่านี้ได้

  • ชื่อ
  • นามแฝง
  • ชื่อเฉพาะ (DN)
  • Canonical DN
  • โดเมน\ชื่อผู้ใช้
  • ที่อยู่อีเมล
  • แนวทาง
  • LegacyExchangeDN
  • SamAccountName
  • ID ผู้ใช้หรือชื่อผู้ใช้หลัก (UPN)

สมาชิกอาร์เรย์และประเภทใน PowerShell

มีความสัมพันธ์ที่แตกต่างกันสี่ประเภทที่คุณสามารถใช้ใน PowerShell ได้:

  • ผู้ใช้รายเดียวถึงผู้ใช้รายอื่น
  • ผู้ใช้รายเดียวถึงผู้ใช้หลายคน
  • ผู้ใช้หลายคนถึงผู้ใช้หลายคน
  • ผู้ใช้หลายรายต่อผู้ใช้รายเดียว

เราจะแสดงตัวอย่างสองตัวอย่างนี้พร้อมกับคำสั่ง ForEach

ผู้ใช้รายเดียวถึงผู้ใช้หลายคนโดยใช้ ForEach

ในตัวอย่างของเรา ผู้ใช้ Ken Walker คือผู้ดูแลระบบ Exchange Online เราต้องการกำหนดสิทธิ์การเข้าถึงแบบเต็มให้กับกล่องจดหมายของผู้ใช้ที่มีอยู่ทั้งหมด

คุณต้องสร้างสคริปต์ PowerShell ที่ประกอบด้วยส่วนต่างๆ เหล่านี้:

  1. ขั้นแรก คุณต้องกำหนดตัวแปรชื่อ $UserMailboxes เพื่อรับกล่องจดหมายของผู้ใช้ทั้งหมดใน Exchange Online
  2. จากนั้น คุณจะเพิ่มตัวแปรเพิ่มเติมชื่อ $UserMailbox เพื่อแสดงถึงสมาชิกแต่ละคนในอาร์เรย์กล่องจดหมายของผู้ใช้
  3. สุดท้าย คุณจะสร้างคำสั่ง PowerShell เพื่อกำหนดผู้ใช้ Ken Walker ที่มีสิทธิ์ การเข้าถึงแบบเต็ม ให้กับกล่องจดหมายของผู้ใช้แต่ละราย หากต้องการอ้างถึงสมาชิกอาร์เรย์ คุณต้องใช้ตัวแปรของอาร์เรย์ ตามด้วยข้อมูลประจำตัว ซึ่งจะมีลักษณะดังนี้ $UserMailbox.Identity การรวมสองส่วนนี้เข้าด้วยกันทำให้คุณสามารถระบุสมาชิกอาร์เรย์แต่ละตัวแยกกันในกระบวนการวนซ้ำ ForEach ใน PowerShell

ตัวอย่างไวยากรณ์ของ PowerShell

$UserMailboxes = Get-Mailbox -ResultSize Unlimited -Filter { (RecipientTypeDetails -eq "UserMailbox") }
ForEach ($UserMailbox in $UserMailboxes) {
    Add-MailboxPermission -Identity $UserMailbox.Identity -User "Identity" -AccessRights FullAccess
}

เรียกใช้สคริปต์ PowerShell ด้านล่าง

$UserMailboxes = Get-Mailbox -ResultSize Unlimited -Filter { (RecipientTypeDetails -eq "UserMailbox") }
ForEach ($UserMailbox in $UserMailboxes) {
    Add-MailboxPermission -Identity $UserMailbox.Identity -User "Ken.Walker@m365info.com" -AccessRights FullAccess
}

มันจะมอบหมายผู้ใช้ Ken Walker ที่มีสิทธิ์ การเข้าถึงแบบเต็ม บนกล่องจดหมายของผู้ใช้ทั้งหมด

ผู้ใช้หลายคนถึงผู้ใช้คนเดียวโดยใช้ ForEach

ในตัวอย่างของเรา ผู้ใช้จากแผนกไอทีต้องการสิทธิ์ การเข้าถึงแบบเต็ม ไปยังกล่องจดหมายเดียว (Amanda.Hansen@m365info.com)

สคริปต์ PowerShell ประกอบด้วยส่วนต่างๆ เหล่านี้:

  1. ในส่วนแรก เรากำหนดตัวแปรชื่อ $ITmembers เพื่อดึงผู้ใช้จากแผนกไอที
  2. จากนั้นคุณจะเพิ่มตัวแปรเพิ่มเติมชื่อ $ITmember เพื่อเป็นตัวแทนของสมาชิกแต่ละคนในอาร์เรย์ IT
  3. สุดท้าย คุณจะสร้างคำสั่ง PowerShell เพื่อกำหนดผู้ใช้จากแผนก IT ที่มีสิทธิ์การเข้าถึงแบบเต็มไปยังกล่องจดหมายเดียว หากต้องการอ้างถึงสมาชิกอาร์เรย์ คุณต้องใช้ตัวแปรของอาร์เรย์ ตามด้วยข้อมูลประจำตัว ซึ่งจะมีลักษณะดังนี้ $ITmember.Identity การรวมสองส่วนนี้เข้าด้วยกันทำให้คุณสามารถระบุสมาชิกอาร์เรย์แต่ละตัวแยกกันในกระบวนการวนซ้ำ ForEach ใน PowerShell

ดูไวยากรณ์ PowerShell ด้านล่าง

$ITmembers = Get-User -ResultSize Unlimited -Filter 'Department -eq "IT"'
ForEach ($ITmember in $ITMembers) {
    Add-MailboxPermission -Identity "Identity" -User $ITmember.Identity -AccessRights FullAccess
}

เรียกใช้สคริปต์ PowerShell ด้านล่าง

$ITmembers = Get-User -ResultSize Unlimited -Filter 'Department -eq "IT"'
ForEach ($ITmember in $ITMembers) {
    Add-MailboxPermission -Identity "Amanda.Hansen@m365info.com" -User $ITmember.Identity -AccessRights FullAccess
}

โดยจะมอบหมายสิทธิ์ การเข้าถึงแบบเต็ม ให้กับผู้ใช้แต่ละรายจากแผนกไอทีในกล่องจดหมาย (Amanda.Hansen@m365info.com) กล่องเดียว

PowerShell ForEach-Object cmdlet

cmdlet ForEach-Object ดำเนินการกับแต่ละรายการในคอลเลกชันของวัตถุอินพุต คุณต้องใช้พารามิเตอร์ InputObject และระบุออบเจ็กต์อินพุตหรือสร้างไปป์ไลน์เป็นอินพุตไปยัง cmdlet

ไวยากรณ์ cmdlet ForEach-Object PowerShell

Get-Mailbox -ResultSize Unlimited | ForEach-Object {
    #PowerShell command to perform operation on each object
}

มีสองวิธีในการใช้คำสั่ง ForEach-Object

ใช้ ForEach-Object ในบล็อกสคริปต์

คุณสามารถใช้บล็อกสคริปต์เพื่อระบุการดำเนินการที่คุณต้องการดำเนินการ ในบล็อกสคริปต์ คุณต้องใช้ $_.variable เพื่อแสดงออบเจ็กต์และกำหนดไว้ในวงเล็บปีกกา { }

ตัวอย่างเช่น คุณต้องการรับ UserPrincipalName ของกล่องจดหมาย Exchange Online ทั้งหมด

ดูไวยากรณ์ ForEach-Object PowerShell ในบล็อกสคริปต์

Get-Mailbox -ResultSize Unlimited | ForEach-Object {$_.UserPrincipalName}

มันจะแสดงรายการ UserPrincipalName ทั้งหมดในกล่องจดหมาย Exchange Online

ใช้ ForEach-Object ในคำสั่งการดำเนินการ

คุณยังสามารถเขียนคำสั่งการดำเนินการซึ่งง่ายต่อการเข้าใจได้ เนื่องจากไม่มีตัวแปรให้ใช้ คุณเพียงแค่ต้องป้อนข้อมูลให้กับ ForEach-Object cmdlet เท่านั้น

สำหรับตัวอย่างนี้ เราจะรับ UserPrincipalName ของกล่องจดหมายทั้งหมดด้วย

ดูไวยากรณ์ cmdlet ForEach-Object PowerShell ในคำสั่งการดำเนินการ

Get-Mailbox -ResultSize Unlimited | ForEach-Object UserPrincipalName

แค่นั้นแหละ!

อ่านเพิ่มเติม: วิธีใช้ตัวดำเนินการแบบลอจิคัลใน PowerShell »

บทสรุป

คุณได้เรียนรู้วิธีใช้ ForEach และ ForEach-Object ใน PowerShell การใช้คำสั่ง ForEach เพื่อวนซ้ำการรวบรวมข้อมูลจะเร็วกว่า cmdlet ForEach-Object ดำเนินการกับคอลเลกชันของวัตถุอินพุตที่มาจากไปป์ไลน์ ซึ่งมีความยืดหยุ่นในการใช้งานมากกว่าแต่ช้ากว่า

คุณสนุกกับบทความนี้หรือไม่? คุณอาจต้องการวิธีใช้ตัวดำเนินการเปรียบเทียบใน PowerShell อย่าลืมติดตามเราและแบ่งปันบทความนี้

บทความที่เกี่ยวข้อง