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

PowerShell สำหรับผู้เริ่มต้น (ตอนที่ 8): พลังของ PowerShell – การติดต่อกับวัตถุ (รับสมาชิก เลือกวัตถุ)


หลังจากส่วน PowerShell สำหรับผู้เริ่มต้น (ตอนที่ 7): The Pipe (และตัวอย่างอีกมากมายให้เล่น) ตอนนี้เราจะมุ่งเน้นไปที่วัตถุ พื้นฐานที่คุณสามารถสร้างได้ แต่ก่อนที่เราจะมาดูคำตอบของแบบฝึกหัดสุดท้ายในส่วนนี้กันก่อน นอกจากนี้เรายังจะมีการทบทวนอย่างรวดเร็วถึงสิ่งที่เราได้เรียนรู้ไปแล้วในส่วนที่ 7

สามารถดูทุกส่วนของซีรีส์ได้ที่นี่: PowerShell สำหรับผู้เริ่มต้น (ซีรีส์)

ทบทวน (ตอนที่ 7)

เรียกใช้ Get-Hotfix แสดงเฉพาะหมายเลข (KB) ของโปรแกรมแก้ไขด่วนและวันที่ติดตั้งในรูปแบบรายการ

นี่คือแบบฝึกหัดของส่วนที่ 7 โอเค เราต้องเรียกใช้ Get-Hotfix จากนั้นเราจะต้องจัดรูปแบบเอาต์พุตในรูปแบบรายการและแสดงเพียงสองสิ่งเท่านั้น ชื่อและวันที่ติดตั้ง สำหรับสิ่งนี้เราจำเป็นต้องมีไปป์ไลน์

มาทำทีละขั้นตอนกัน

เมื่อคุณเรียกใช้ Get-Hotfix โดยไม่มีพารามิเตอร์ใด ๆ คุณจะสามารถเห็นชื่อส่วนหัวได้ (ขอเรียกพวกเขาว่าแอตทริบิวต์ของวัตถุ ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้เพิ่มเติมด้านล่าง) ตอนนี้เรามีชื่อแล้ว เป็นเรื่องง่ายที่จะใส่คำสั่งที่ซับซ้อนกว่านี้ด้วยไพพ์

นี่เราอยู่.

ทบทวน


ไปป์จะนำทุกอย่างทางด้านซ้ายของไปป์และส่งต่อไปยังคำสั่งทางด้านขวาของไปป์ Format-Table, Format-List และ Format-Wide จะปรับเอาต์พุตของคำสั่ง


สัมผัสถึงพลังของ PowerShell แบบอิงวัตถุ

PowerShell เป็นแบบเชิงวัตถุ สิ่งนี้หมายความว่าอะไรและสิ่งนี้นำมาซึ่งอะไร? ในสภาพแวดล้อมเชิงวัตถุมีคนทำบางอย่างให้คุณแล้ว ช่างเป็นคนดีจริงๆ นั่นคือใคร? ฉันไม่รู้. แน่นอนว่าเป็นผู้พัฒนา Micrsosoft หรือหลาย ๆ คน ?

ฉันไม่สามารถพูดได้ดีไปกว่า Bruce Payette ผู้เขียน Windows PowerShell in Action (รุ่นที่สอง):

คุณใช้วัตถุที่คนอื่นกำหนดไว้สำหรับคุณ

ประเด็นคืออะไร? ผมขอยกตัวอย่างให้คุณฟัง คุณรู้จัก ipconfig อย่างแน่นอน มันเป็นคำสั่งให้แสดงการตั้งค่า IP ของคุณ Ipconfig ส่งออกข้อความธรรมดา

จนถึงตอนนี้ดีมาก จะทำอย่างไรถ้าคุณต้องการแสดงเฉพาะที่อยู่ IPv4? ใช่ ฉันได้ยินคุณตะโกนออกมาดังๆ: “เป็นไปได้ ใช้การค้นหา” ตกลงมาทำกัน

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

ตกลง คำสั่งที่เทียบเท่ากับ ipconfig คือ Get-NetIPAddress

และตอนนี้ดูสิ่งนี้:

อันที่สองหวานกว่ามาก ฉันขอยกตัวอย่างอื่นให้คุณ: dir ใน cmd และ Get-ChildItem ใน PowerShell

Dir (หากป้อนเป็น cmd) จะแสดงข้อความธรรมดา

รับ ChildItem ส่งออกวัตถุ

หมายเหตุด้านข้าง: หากคุณเรียกใช้ dir ใน PowerShell Get-ChildItem จะถูกดำเนินการ นี่อาจทำให้สับสนเล็กน้อย

นี่เป็นการชิมเล็กน้อยสำหรับหัวข้อที่กำลังจะมาถึง รับ ChilIdtem และวัตถุในการดำเนินการ


Get-ChildItem -File C:\Temp | Select-Object Name,LastWriteTime,CreationTime,Directory,Length

ตอนนี้เราจะเจาะลึกเกี่ยวกับ PowerShell Objects

การค้นพบสิ่งที่มีคนกำหนดไว้ให้คุณแล้ว (Get-Member, Select-Object)

เราจะเน้นไปที่ตัวอย่างข้างต้นต่อไป ฉันได้ดำเนินการตามคำสั่งแล้ว


Get-ChildItem -File C:\Temp | Select-Object Name,LastWriteTime,CreationTime,Directory,Length

ตอนนี้เรามาดูผลลัพธ์ "ปกติ" ของ Get-ChildItem กัน มันแสดงโหมด, LastWriteTime, ความยาวและชื่อ

ฉันจะรู้ได้อย่างไรว่ามีมากกว่านี้? (CreationTime, ไดเร็กทอรี)?

ฉันได้ดูล่วงหน้าเพื่อดูว่าเกิดอะไรขึ้นกับคำสั่ง Get-Member


Get-ChildItem | Get-Member

และที่นั่นฉันพบคุณลักษณะ 2 ประการ:

จากนั้นฉันก็ใช้คุณลักษณะนี้

Get-Member cmdlet รับคุณสมบัติและวิธีการของออบเจ็กต์


พลังของ PowerShell คือการวางแนววัตถุ นี่คือสิ่งที่ทำให้ PowerShell แตกต่างจากเครื่องมืออื่นๆ มากมาย คุณต้องจัดการกับวัตถุ มิฉะนั้น คุณจะไม่มีวันตระหนักถึงพลังของ PowerShell

ใช้ Get-Member เพื่อสำรวจวัตถุ


คุณสมบัติและวิธีการคืออะไร?

รู้เบื้องต้นเกี่ยวกับคุณสมบัติและวิธีการ (รับสมาชิก)

ฉันได้กล่าวไปแล้วว่ามีมากขึ้น เราสามารถทำอะไรได้มากกว่าด้วย PowerShell จากนั้นจึงเรียกใช้คำสั่งง่ายๆ PowerShell เป็นแบบเชิงวัตถุ มีคุณสมบัติและวิธีการ มาดูคุณสมบัติกันก่อน ตกลง ฉันขอเน้นย้ำถึงความสำคัญของสิ่งที่เรากำลังทำอยู่ตอนนี้ ฉันอ้างว่า: คุณไม่มีโอกาสเข้าใจแม้แต่ความช่วยเหลือหากคุณไม่คุ้นเคยกับวัตถุ คุณไม่เชื่อฉันเหรอ?

Get-Date เป็นคำสั่งที่ง่าย แต่ถ้าคุณดูตัวอย่าง คุณจะเห็นว่าตัวอย่างกำลังจัดการกับวัตถุอยู่แล้ว ... หากคุณเรียกใช้ Get-Help Get-Date -Online และเลื่อนไปที่ตัวอย่างที่ 4 และ 5 และคุณไม่เข้าใจว่าเกิดอะไรขึ้นที่นั่น ถ้าอย่างนั้นคุณก็เดือดร้อน


Get-Help Get-Date -Online

ทั้งหมดนี้หมายความว่าอย่างไร? ความหมายของจุดคืออะไร และวงเล็บคืออะไร และฉันจะรู้ได้อย่างไรว่าจะดูที่ไหน

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

เราแยกแยะระหว่างคุณลักษณะและวิธีการ

คุณลักษณะ - วัตถุ คืออะไร

คุณสมบัติจะแสดงให้คุณเห็นว่าวัตถุคืออะไร วัตถุอาจเป็นสีเขียว อาจเป็นวันที่ อาจเป็นจริงหรือเท็จ หรืออย่างอื่น

ลองใช้ตัวอย่างของ Get-Volume

Get-Member แสดงคุณลักษณะทั้งหมดของคำสั่ง Get-Volume และคุณต้องใช้ท่อ


Get-Volume | Get-Member -MemberType Properties

ตอนนี้เราสามารถเรียกคุณสมบัติเหล่านั้นได้แล้ว วิธีที่ดีที่สุดในการทำเช่นนี้คือการใช้ Select-Object สมมติว่าเราต้องการแสดงอักษรระบุไดรฟ์ ขนาด และขนาดที่เหลืออยู่ โดยวิธีการ: อย่าลืมใช้ TAB


Get-Volume | Select-Object DriveLetter,Size,SizeRemaining

ตัวอย่างอื่น. ความเร็วลิงก์ของการ์ดเครือข่ายของคุณคือเท่าใด


Get-NetAdapter | Get-Member -MemberType property

คุณจะพบคุณสมบัติ LinkSpeed


Get-NetAdapter | Select-Object LinkSpeed

โอเค เรามาหยุดที่นี่กัน เราต้องการสิ่งนี้เพื่ออะไร? ตัวอย่าง. คุณต้องการบันทึกชื่อไฟล์ทั้งหมดไว้ในไฟล์เดียว สำหรับสิ่งนี้ เราจำเป็นต้องมีรายชื่อไฟล์ทั้งหมด และเฉพาะชื่อเท่านั้น ชื่อเท่านั้น! เราจะได้ชื่อทั้งหมดได้อย่างไร? ขั้นตอนที่ 1 คือการค้นหาคุณลักษณะของชื่อไฟล์


Get-ChildItem C:\Temp | Get-Member -MemberType property

คุณจะพบคุณสมบัติที่เรียกว่า FullName นี่เราอยู่.


Get-ChildItem -Path C:\Temp\ | Select-Object FullName

และบันทึกเป็นไฟล์…


Get-ChildItem C:\Temp\ | Select-Object FullName | Out-File C:\Temp\test.txt

สำหรับส่วนนี้ สิ่งสำคัญเพียงอย่างเดียวคือคุณต้องจำไว้ว่ามีแอตทริบิวต์และสามารถแสดงได้ด้วย Get-member

เพื่อเน้นย้ำความสำคัญของหัวข้อนี้: รู้ว่าวัตถุสร้างความแตกต่างได้อย่างไร ความแตกต่างระหว่างผู้ใช้ PowerShell ปกติและผู้ใช้ PowerShell ที่ดี

สมมติว่าเจ้านายของคุณต้องการมีรายชื่อเซิร์ฟเวอร์ทั้งหมดในโดเมนของคุณ เราควรทำอย่างไรตอนนี้? จับภาพหน้าจอ? กำลังซื้อเครื่องมือของบุคคลที่สามใช่ไหม ไม่จำเป็น. ใช้ PowerShell


Get-ADComputer -Filter {operatingsystem -like '*server*'} | Select-Object Name | Out-File C:\Temp\servers.txt

นำรายชื่อนี้ไปมอบให้เจ้านายของคุณ

ต้องการรายการโปรแกรมแก้ไขด่วนที่ติดตั้งทั้งหมดในรูปแบบ HTML หรือไม่ เรียกใช้ PowerShell


Get-HotFix | Select-Object HotFixID,InstalledOn | ConvertTo-Html | Set-Content C:\Temp\hotfixes.htm

แต่รอสักครู่ เราได้เรียนรู้ในตอนที่ 7 (The Pipe) ว่าเราสามารถทำสิ่งต่างๆ ได้มากมายด้วยคำสั่งรูปแบบ สิ่งนี้ใช้ได้กับ Format-Table หรือไม่ คำตอบคือใช่ แต่นั่นไม่ใช่ความคิดที่ดี

ข้อควรจำ: ใช้คำสั่งรูปแบบ (Format-Table, Format-List และ Format-Wide) ที่ส่วนท้ายเท่านั้น Select-Object คือเพื่อนของคุณเมื่อพูดถึงวัตถุ ถ้าคุณต้องการแสดงรายการข้อมูลบนหน้าจอ ให้ใช้รูปแบบตาราง สำหรับทุกสิ่งทุกอย่าง ให้ใช้ Select-Object Select-Object ส่งต่อข้อมูลตามที่เป็นอยู่ ตารางรูปแบบจะแก้ไขข้อมูลที่อาจนำไปสู่พฤติกรรมที่ไม่คาดคิด


แอตทริบิวต์จะแสดงให้คุณเห็นว่าวัตถุคืออะไร ใช้ Get-Member เพื่อสำรวจคุณลักษณะ ใช้ Select-Object เพื่อดึงข้อมูลแอตทริบิวต์ คำสั่ง Select-Object และ Format ไม่ใช่เพื่อนกัน ใช้ Format-Table/List/Wide ที่ส่วนท้ายของโค้ดเท่านั้น ใช้ Select-Object เพื่อรับวัตถุที่ไม่เปลี่ยนแปลง


วิธีการ - สิ่งที่ออบเจ็กต์สามารถทำได้ ทำได้

ลองมาตัวอย่างจากบทนำ มันแสดงความช่วยเหลือของ Get-Date ตัวอย่างส่วนใหญ่อ้างถึงคุณลักษณะ (วัตถุคืออะไร) แต่เราอยากเปลี่ยนแปลงอะไรบางอย่าง เราต้องการทำอะไรบางอย่าง ในส่วนสุดท้ายเราได้ใช้ Select-Object ในส่วนนี้เราจะใช้วิธีพิเศษ .NET คุณชอบสิ่งนี้แทนที่จะเป็น Select-Object อย่างไร

เอาล่ะ มาช้าลงกันดีกว่า คุณสามารถใช้ Select-Object หรือ a. วิธี NET() หากคุณใช้. NET มีข้อดีบางประการ พิมพ์สิ่งต่อไปนี้ใน PowerShell:


(Get-Date).

ตอนนี้กด CTRL + ช่องว่าง ว้าวมันดูดี คุณได้รับวัตถุทั้งหมดที่นำเสนอ เลือกของคุณ

วงเล็บมีไว้เพื่ออะไร? คำสั่งในวงเล็บจะดำเนินการทันที ซึ่งหมายความว่ามีค่าอยู่แล้วเมื่อคุณใช้วิธีการ โอเค มีวิธีที่เรียกว่า Adddays นับถอยหลังเจ็ดปีกันเถอะ อย่าลืมใช้ TAB เพื่อหลีกเลี่ยงการพิมพ์มากเกินไป


(Get-Date).AddYears(-7)

อีกตัวอย่างหนึ่งคือการสำรวจวิธีการทั้งหมดของคำสั่ง Get-Service


Get-Service | Get-Member -MemberType method

มีวิธีที่เรียกว่าหยุด นั่นฟังดูดี เราสามารถหยุดบริการได้ด้วยวิธีนี้


(Get-Service spooler).Stop()

ตกลง ฉันต้องยอมรับว่าการหยุดบริการโดยใช้ Stop-Service นั้นง่ายกว่า

แล้วสตริงล่ะ? ฉันเก็บชื่อของฉันไว้ในตัวแปร ตัวแปรใช้ในการจัดเก็บข้อมูล


$string='Patrick Gruenauer'

คำถามตอนนี้คือ เราสามารถทำอะไรกับชื่อนี้ได้บ้าง? สมมติว่าเราต้องการแสดงตัวอักษร 2 ตัวแรก หากคุณรู้จัก Get-Member คุณจะสามารถสำรวจวิธีการของสตริงนี้ได้


$string | Get-Member

คุณจะพบวิธี Substring ที่นั่น


$string.Substring(0,2)

ดี. หากคุณต้องการแยกชื่อและนามสกุลให้ใช้วิธีการแยก ไม่จำเป็นต้องบอกว่าคุณสามารถค้นหาวิธีนี้ได้ผ่าน Get-Member

เราต้องหาทางแยก ตัวคั่นของเราคือช่องว่างระหว่างชื่อและนามสกุลของฉัน

ตกลง ชื่อของฉันถูกเก็บไว้ใน $string ตอนนี้ฉันใช้วิธีแยก


$string.Split('')

ดี.


วิธีการสามารถเปลี่ยนแปลงหรือดำเนินการบางอย่างได้ เรียกใช้วิธี Get-Member -MemberType เพื่อสำรวจวิธีการต่างๆ ใส่คำสั่งและค่าเมธอดในวงเล็บ


ทั้งหมดนี้มีไว้เพื่ออะไร?

ฉันไม่สามารถพูดถึงมันได้มากพอ จงอดทน ในส่วนถัดไปเราจะพูดถึง WMI แล้วคุณจะสัมผัสได้ถึงพลังแห่งวัตถุ แต่ก่อนที่เราจะจบส่วนนี้ ผมขอยกตัวอย่างให้คุณทราบก่อน: ตัวอย่างที่ใช้งานได้จริงจากบล็อกของผม คุณจะได้รับรายชื่อผู้ใช้ คุณต้องการสร้างผู้ใช้จากไฟล์ข้อความนั้น

รหัสนี้อ่านยากเล็กน้อยสำหรับผู้เริ่มต้น แต่สิ่งที่ฉันอยากทำคือเน้นย้ำถึงความสำคัญของการจัดการกับวัตถุ นี่คือรายชื่อผู้ใช้

และนี่คือรหัส:


Get-Content C:\temp\users.txt | ForEach-Object {$Split = $_.Split(" "); $given=$Split[0]; $sur=$Split[1]; New-ADUser -GivenName $given -Surname $sur -Name ($given + " " + $sur) -UserPrincipalName (($sur + "@" + "$env:userdnsdomain")).ToLower() -SamAccountName ($sur).ToLower() -AccountPassword (ConvertTo-SecureString -AsPlainText "Passw00rd123" -Force) -Enabled $true -ChangePasswordAtLogon $true -Verbose}

แต่ละอ็อบเจ็กต์ในไฟล์ข้อความ (สตริง) จะถูกแยกออกจากกัน และตัวคั่นคือช่องว่าง ไม่ต้องกังวลหากคุณไม่เข้าใจคำสั่งนี้อย่างถ่องแท้ มันเป็น Active Directory คำสั่งใช้แต่ละชื่อและสร้างผู้ใช้ Active Directory ด้วยชื่อและนามสกุลที่กำหนดที่ถูกต้อง

สามารถดูบทความเต็มได้ที่นี่: PowerShell: การเพิ่มผู้ใช้ Active Directory จากไฟล์ข้อความ (เป็นกลุ่ม)

วิธีการ 2 ขั้นตอน

ปฏิบัติตามแนวทางเหล่านี้แล้วคุณจะได้รับประโยชน์เพิ่มเติมจาก PowerShell

สิ่งที่คุณต้องจำไว้คือวิธีสองขั้นตอน เชื่อฉัน.

1. สอบถามความเป็นไปได้ทั้งหมด: เรียกใช้ รับสมาชิก


Get-Date | Get-Member

2. เรียกแอตทริบิวต์หรือเมธอดด้วย (). หรือ select-object หรือ เลือก


(Get-Date -Year 1976 -Month 03 -Day 23).dayofyear


(Get-Date -Year 1976 -Month 03 -Day 23).dayofweek


(Get-Date -Year 1976 -Month 03 -Day 23).AddDays(10)

ใช่แล้ว มันเป็นวันเกิดของฉัน ใช่แล้ว ฉันอายุไม่ 20 แล้ว ใช่ ใกล้จะสิ้นสุดโพสต์นี้แล้ว ;-) ฉันมีอีกตัวอย่างหนึ่ง

อีกตัวอย่างที่ดีของวิธีการแสดงรายการคุณสมบัติของผู้ใช้ Active Directory


Get-ADUser petra -Properties * | Select-Object Name,LastLogonDate

ก่อนจะลืมการออกกำลังกายไปจนกว่าจะถึงส่วนต่อไป

ออกกำลังกาย

แค่นั้นแหละสำหรับวันนี้ นี่คือแบบฝึกหัดจนถึงส่วนถัดไป

คุณลักษณะ

สร้างไดเร็กทอรี C:\Temp1. สร้างไฟล์ข้อความ testfile1.txt ใน C:\Temp1 ใช้ PowerShell เท่านั้น หากคุณต้องการความช่วยเหลือให้ใช้ความช่วยเหลือ (Get-Help) เปิดไฟล์. ตอนนี้แสดงแอตทริบิวต์ต่อไปนี้ด้วย Select-Object หรือเทคนิคอื่น: ชื่อไฟล์ นามสกุลไฟล์ และวันที่เข้าถึงครั้งล่าสุด

วิธีการ

คำนวณย้อนหลัง 10 ปีโดยใช้ Get-Date จากวันนี้ ตอบคำถามต่อไปนี้: วันไหนของปี? (1..365?)

วิธีแก้ปัญหาสามารถพบได้ในส่วนถัดไป

พบกันใหม่ในบทความถัดไป: PowerShell สำหรับผู้เริ่มต้น (ตอนที่ 9): พลังของ WMI

แพทริค กรูเนาเออร์ MVP PowerShell

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