หลังจากที่ได้เจอกันในงาน mvpskill.com: “Technical show case Windows Server 2012” เมื่อวันที่ 28 กันยายน 2556 นั้น มีความรู้สึกว่าเนื้อหาที่ได้กล่าวไปนั้นอาจจะรวบรัดตัดความไปบ้างเนื่องจากข้อจำกัดของเวลา ดังนั้นผมจึงขออาศัยพื้นที่ในส่วนของ knowledge base นี้เพื่อทำการอธิบายเพิ่มเติมเกี่ยวกับ Windows Power Shell โดยจะขอมุ่งเน้นที่ Version 3. 0 ซึ่งเป็นเวอร์ชันที่ใช้งานใน Windows Server 2012 ดังนี้ครับ
รู้จักกับ Windows Power Shell และ Power Shell ISE
Windows Power Shell นั้นเรียกได้ว่าเป็นภาษาอีกภาษาหนึ่งที่มีพื้นฐานการพัฒนามาจาก .Net Framework และผ่านการการออกแบบมาเพื่อให้ผู้ดูแลระบบสามารถนำไปใช้งานในการเขียนโปรแกรมในรูปแบบของ script ต่างๆ เพื่อบริหารจัดการระบบต่างๆ ของ Window Server ได้อย่างมีประสิทธิภาพ สมชื่อกับที่เป็น “Power” หรือว่ามีพลังอำนาจจริงๆ ครับ เนื่องจากมีคำสั่งจำนวนมาก และสามารถใช้งานได้ง่าย เสียอย่างเดียวคือคำสั่งที่ยากนั้นทำให้จำยากตามไปด้วย และยังมี Parameter อีกมากมายให้จำครับ ดังนั้นจึงจำเป็นต้องมีเครื่องมือชื่อว่า “Power Shell ISE (ISE = Integrated Scripting Environment)” มาช่วยให้ง่ายขึ้น
โดย Power Shell ISE นั้นจะมี command windows มาคุณสมบัติต่างๆ เช่น snippet และ Intellisense มาช่วยงานดังนี้
Command Windows ของ Power Shell ISE ช่วยอำนวยความสะดวกให้ผู้ใช้งานสามารถเลือกใช้งานคำสั่งต่าง ๆ ได้ง่ายขึ้น พร้อมกับมีพื้นที่สำหรับกรอก paramter ต่างๆ ให้ได้ในขั้นตอนเดียว
Snippet และ Intellisense ซึ่งจะช่วยเติมคำสั่งให้ครบถ้วนได้โดยไม่ต้องพิมพ์คำสั่งทั้งหมด นอกจากนี้ยังช่วยบอกชนิดของข้อมูลสำหรับ Parameter ต่างๆ ด้วย ทำให้การใช้งานง่ายขึ้นมาก
เอาล่ะครับ หลังจากได้รู้จักกับเครื่องไม้เครื่องมือกันไปแล้ว ต่อไปเรามาดูธาตุแท้ของเจ้า Windows Power Shell กันเลยครับ
รูปแบบของ cmdlets
Windows Power Shell มีลักษณะการทำงานที่อ้างอิงมาจาก .Net Framework และมีรูปแบบการทำงานแบบ Object อย่างสมบุรณ์ โดยแต่ละคำสั่งของ Power Shell นั้นจะเรียกว่า “cmdlets” (อ่านว่า “คอม-มาน-เล็ท”) โดยแต่ละ cmdlets นั้นจะมีองค์ประกอบ 2 ส่วนด้วยกัน ได้แก่
1. Verb เป็นส่วนที่บ่งบอกกระทำว่าต้องการดำเนินการอะไรกับ Object ที่ต้องการ เช่น
- New- หมายถึงการสร้าง Object ใหม่
- Get- หมายถึงการดึงค่าข้อมูลต่างๆ ของ Object
- Set- หมายถึงการตั้งค่าของข้อมูลต่างของ Object
- Remove- หมายถึงการลบ Object ออก
2. Noun เป็นการระบุชนิดของ Object ที่ต้องการดำเนินการด้วย เช่น
- ADUser หมายถึงต้องการทำงานกับ User Object ในระบบ Active Directory Domain Service
- Process หมายถึงต้องการทำงานกับ Process ต่างๆ ที่ทำงานอยู่ในเครื่องคอมพิวเตอร์ที่ระบุ
ดังนั้นการอธิบายความหมายของ cmdlets จึงสามารถเข้าใจได้โดยง่ายจากการดูจาก Verb และ Noun ตามที่ระบุ เช่น
- New-ADUser หมายถึงการสร้าง User Object ในระบบ Active Directory Domain Service
- Get-ADUser หมายถึงการดึงค่า Attribute ต่างๆ ของ User Object ในระบบ Active Directory Domain Service
นอกจากนี้ Power Shell ยังมีความสามารถในการกำหนดชื่อย่อ (Alias) ให้กับ cmdlet ต่างๆ ได้ด้วย ซึ่งปกติแล้วจะมี Alias ที่กำหนดมาให้แล้วดังตัวอย่างต่อไปนี้
- Where ย่อมาจาก Where-Object เป็นการกำหนดให้ Power Shell ดำเนินการเฉพาะกับ Object ที่มีเงื่อนไขเป็นไปตามที่กำหนด
- Sort ย่อมาจาก Sort-Object เป็นการกำหนดให้ Power Shell ทำการเรียงข้อมูลของ Object ต่างๆ ตามเงื่อนไขที่กำหนด
- Fl ย่อมาจาก Format-List เป็นการกำหนดรูปแบบการแสดงผลในรูปแบบ List หรือแสดงเป็นรายการๆ ไปนั่นเอง
- Ft ย่อมาจาก Format-Table เป็นการกำหนดรูปแบบการแสดงผลในรูปแบบ Table หรือตาราง
Pipeline ใน Windows Power Shell
นอกจากนี้ Windows Power Shell ยังสนับสนุนการทำงานในรูปแบบ Pipeline ได้อีกด้วย (เขียนแทนด้วยสัญลักษณ์ “|” อ่านว่า “Pipe ไปป์”) ซึ่งการทำงานแบบ Pipeline นั้น พูดให้เข้าใจง่ายๆ ก็คือการส่ง output จาก cmdlet หนึ่ง ไปเป็น Input ของ อีก cmdlet หนึ่ง ดังตัวอย่างในรูปเป็นการใช้งานคำสั่ง
ตัวอย่าง 1 Get-Process | Where { $_.handles –gt 500} | Sort handles | Format-Table |
จากคำสั่งตัวอย่างข้างต้น จะเห็นได้ว่าคำสั่งจะถูกแบ่งออกเป็น 4 ส่วน ได้แก่ Get-Process, Where, Sort และ Format (ดังรูป)ซึ่งแต่ละส่วนจะมีการดำเนินการตามลำดับดังต่อไปนี้
- Get-Process เป็นการสั่งให้ Windows Power Shell ทำการแสดงรายชื่อและข้อมูลต่างๆ ของ Process ที่กำลังทำงานในเครื่องคอมพิวเตอร์ออกมาทั้งหมด จากนั้น output ของ Get-Process จะถูกส่งไปยัง cmdlet ถัดไป
- Where เป็นการกรองผลลัพธ์ โดยในที่นี้ cmdlet Where จะทำการอ่าน Input (ซึ่งก็คือ output ของ Get-Process) มาทีละ 1 Object ซึ่ง Object ที่ Where กำลังทำงานอยู่นี้จะถูกเขียนแทนด้วยสัญลักษณ์ $_ (หรือ THIS) นั่นเอง และเนื่องจากมีการใช้เงื่อนไข $_.handles –gt 500 จึงหมายถึงว่า ให้ cmdlet Where ทำการเลือกเฉพาะ process ที่มีค่า handle ของ Object มากกว่า 500 ($_.handle หมายถึงค่าของ attribute ที่ชื่อ handle ใน object ที่ถูกส่งมาจาก pipeline ก่อนหน้า)
- Sort เป็นการสั่งให้ Windows Power Shell ทำการเรียงลำดับข้อมูล โดยทำการเรียงข้อมูลโดยพิจารณาจาก Attribute ที่ชื่อ handle (โดยปกติจะเรียงจากน้อยไปหามาก)
- Format-Table เป็นการสั่งให้ Windows Power Shell ทำการแสดงข้อมูลในรูปแบบตาราง
ซึ่งจากคำสั่งดังกล่าวจะได้ผลการทำงานดังต่อไปนี้
Output1: ผลการดำเนินการจากการใช้คำสั่ง Get-Process | Where { $_.handles –gt 500} | Sort handles | Format-Table
การวนซ้ำ (Loop) ใน Windows Power Shell
เนื่องจากในบางกรณีการทำงานอาจจะต้องมีการทำงานซ้ำๆ ดังนั้น Windows Power Shell จึงมีความสามารถในการทำงานซ้ำๆ โดยสามารถใช้คำสั่ง Foreach เพื่อทำงานซ้ำได้ โดยคำสั่ง Foreach นั้นจะทำซ้ำคำสั่งกับทุก Object ที่เกิดขึ้น โดย Object นั้นๆ อาจจะมาจากการทำ Pipeline ก็ได้ ดังตัวอย่างต่อไปนี้
ตัวอย่าง 2 Get-Process | Foreach { $_.name } |
เป็นคำสั่งที่ใช้การดึงรายชื่อของ process ต่างๆ ที่ทำงานอยุ่ในเครื่องคอมพิวเตอร์ ออกมา แล้วนำไปเข้าสู่คำสั่ง Foreach โดยแต่ละ object ที่คำสั่ง foreach มองเห็นจะถูกแทนด้วย $_ ซึ่งหมายถึง object ที่เป็น output จาก cmdlet Get-Process และจากนั้นให้คำสั่ง foreach ทำการแสดงเฉพาะชื่อของ process ออกมา ($_.name)
Output2: ผลจากการทำงานของคำสั่ง Get-Process | Foreach {$_.name}
ซึ่งใน Windows Power Shell เวอร์ชัน 3.0 นั้นได้มีการพัฒนาตรงนี้ไปอีกระดับหนึ่งเพื่อให้ผู้ดูแลระบบ (ซึ่งต้องไม่ลืมว่าคนกลุ่มนี้ไม่ใช่ Programmer ที่จะมีพื้นฐานการทำงานแบบ Object) ทำงานได้ง่ายขึ้น ไม่ต้องไปยุ่งกับหลักการของ Object มากเกินไป ดังนั้น Power Shell 3.0 จึงอนุญาติให้สามารถละเว้นการใช้งาน $_ ไว้ได้ เหลือเพียงคำสั่งดังต่อไปนี้
ตัวอย่าง 3 Get-Process | Foreach name |
คำสั่งในตัวอย่างที่ 3 นี้ก็ยังคงให้ output เช่นเดียวกับ output2 ก่อนหน้านี้ครับ (ขอให้สังเกตนิดนึงว่าคำสั่งในตัวอย่างที่ 3 นี้ไม่ต้องใส่เครื่องหมายปีกกาเปิด/ปิด {} หลัง foreach นะครับ)
และหากเรานำหลักการนี้ไปประยุกต์ใช้กับตัวอย่างที่ 1 ก็จะได้ดังตัวอย่างที่ 4 ดังนี้
ตัวอย่าง 4 (ประยุกต์จากตัวอย่างที่ 1) Get-Process | Where handles –gt 500 | Sort handles | Format-Table |
โดยคำสั่งในตัวอย่างที่ 4 และตัวอย่างที่ 1 จะให้ผลลัพธ์ เหมือนกันครับ แต่ตัวอย่างที่ 4 จะมีโปรแกรมที่สามารถอ่านเข้าใจง่ายกว่า ไม่ต้องงงกับ $_ ที่เกิดขึ้นมาใน code program
ข้อจำกัด
ถึงแม้ว่าใน Power Shell 3.0 จะสามารถตัด $_ ออกไปได้ก็จริง แต่มีบางกรณีที่ไม่สามารถตัด $_ ออกไปได้ครับ เช่นในกรณีที่ต้องการให้แสดงชื่อของ process เป็นตัวอักษรตัวพิมพ์ใหญ่ทั้งหมด ซึ่งในการนี้เราจำเป็นต้องใช้ method toupper() ของ object name ครับ
ตัวอย่าง 5 Get-Process | Foreach { $_.name.toupper() } |
ในตัวอย่างที่ 5 นี้มีการเรียกใช้ method toupper() ของ attribute name (ซึง name เป็นชนิดข้อมูล string) ดังนั้นจึงทำให้ชื่อของ process ทุก process ที่แสดงออกมาเป็นตัวอักษรพิมพ์ใหญ่ทั้งหมด ซึ่งเป็นไปตามความต้องการ (ตัวอย่าง output ดังรูป)
Output3: ผลจากการทำงานของคำสั่ง Get-Process | Foreach {$_.name.toupper()}
แต่หากเราใช้ทำงานในรูปแบที่ไม่ใส่ $_ คือใช้คำสั่งดังตัวอย่าง 6 จะเกิด Error ขึ้นดัง output4
ตัวอย่าง 6Get-Process | Foreach name.toupper |
Output4: ผลจากการทำงานของคำสั่ง Get-Process | Foreach name.toupper()
ดังนั้นการจะใช้คำสั่งในรูปแบบใดนั้น ก็ต้องศึกษาที่มา ที่ไป และรูปแบบคำสั่งให้คล่องกันก่อนนะครับ จึงจะสามารถนำไประยุกต์กับการใช้งานจริงๆ ได้ครับ เอาละครับเนื้อหาใน ภาค 1 นี้ก็แน่นเปรี้ยะกันไปแล้ว ก็จะขอพักเบรคให้ไปทำความรู้จัก คุ้นเคยกับ Windows Power Shell กันให้มากขึ้นนะครับ
ส่วนเนื้อหาในภาค 2 จะพูดถึงการทำงานของ script ในการ Add user บน Active Directory Domain Service (AD DS)