ความแตกต่างระหว่าง 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 ได้เช่นกัน
มีวิธีการต่างๆ ที่คุณสามารถใช้เพื่อสร้างอาร์เรย์ได้:
- ใช้คำสั่ง PowerShell พื้นฐานและใช้อาร์เรย์ ตัวอย่างเช่น แต่ละ PowerShell cmdlet ที่ขึ้นต้นด้วย รับ
- ข้อมูลจากรูปแบบเฉพาะ เช่น ไฟล์ CSV ก็สามารถเป็นอาร์เรย์ได้เช่นกัน เมื่อคุณเปิดไฟล์ CSV ไฟล์จะมีแถวและคอลัมน์ โดยแต่ละ แถว แสดงถึงอาร์เรย์ของสมาชิก แต่ละคอลัมน์แสดงถึงคุณสมบัติของสมาชิก
- การใช้ กลุ่ม แท้จริงแล้วคืออาร์เรย์ กลุ่มทำหน้าที่เป็นคอนเทนเนอร์แบบลอจิคัลที่มีสมาชิกกลุ่มซึ่งเป็นอาร์เรย์
- หากคุณเขียนสมาชิกแต่ละรายการด้วยตนเองโดยคั่นด้วยอักขระลูกน้ำ คุณจะสร้างอาร์เรย์ของ ผู้ใช้หลายคน ได้ด้วย
ใช้คำสั่ง 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 ตัวแปรจะแสดงกล่องจดหมายทั้งหมด
$ExchangeMailboxesPowerShell 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 ที่ประกอบด้วยส่วนต่างๆ เหล่านี้:
- ขั้นแรก คุณต้องกำหนดตัวแปรชื่อ $UserMailboxes เพื่อรับกล่องจดหมายของผู้ใช้ทั้งหมดใน Exchange Online
- จากนั้น คุณจะเพิ่มตัวแปรเพิ่มเติมชื่อ $UserMailbox เพื่อแสดงถึงสมาชิกแต่ละคนในอาร์เรย์กล่องจดหมายของผู้ใช้
- สุดท้าย คุณจะสร้างคำสั่ง 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 ประกอบด้วยส่วนต่างๆ เหล่านี้:
- ในส่วนแรก เรากำหนดตัวแปรชื่อ $ITmembers เพื่อดึงผู้ใช้จากแผนกไอที
- จากนั้นคุณจะเพิ่มตัวแปรเพิ่มเติมชื่อ $ITmember เพื่อเป็นตัวแทนของสมาชิกแต่ละคนในอาร์เรย์ IT
- สุดท้าย คุณจะสร้างคำสั่ง 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 อย่าลืมติดตามเราและแบ่งปันบทความนี้

