วันอาทิตย์ที่ 22 พฤศจิกายน พ.ศ. 2558

ข้อความและอักขระพิเศษใน Powershell


    บทความนี้จะอธิบายเกี่ยวกับการแสดงผลค่าต่าง ๆ ไม่ว่าจะเป็นข้อความหรืออักขระพิเศษ ซึ่งบ่อยครั้งเราต้องแสดงผลค่าต่าง ๆ หรือเก็บค่าตัวแปรต่าง ๆ โดยใช้คำเหล่านี้ เรามาดูกันดีกว่าว่ามีอะไรกันบ้าง

1. การใช้ single quotes (' ') และ double quotes (" ")


    จากภาพด้านบน คำสั่งแรกเป็นการใช้ single quotes ซึ่งเราจะเห็นว่า backtick กับตัวแปร $env:USERPROFILE นั้นได้แสดงผลตามปกติ คือแสดงข้อความทั้งหมดที่อยู่ในบลอค ส่วนคำสั่งที่ใช้ double quotes พบว่าทั้ง backtick และ $env:USERPROFILE ได้ถูกแสดงผลออกมาต่างกับคำสั่งแรกโดยสิ้นเชิง


2. อักขระพิเศษในข้อความ

    เราสามารถใช้ double quotes ใน single quotes บลอคได้ และในทางกลับกันก็สามารถใช้ single quotes ใน double quotes บลอคได้เช่นกัน


    เราสามารถใช้ single quotes ซ้อนใน single quotes บลอคได้ด้วย และสามารถใช้ double quotes ซ้อนใน double quotes บลอคได้ด้วยเช่นกัน และเรายังสามารถใช้ backtick ได้ใน double quotes แต่ไม่สามารถใช้ได้ใน single quotes นะครับ



    การขึ้นบรรทัดใหม่หรือการ Tab ก็สามารถทำได้ใน double quotes บลอคเช่นเดียวกันครับ



3. ข้อความที่มีหลายบรรทัด

    เราสามารถใช้ backtick แทนการขึ้นบรรทัดใหม่ในหน้า console หรือสคริปที่เราเขียนได้ แต่ในกรณีที่มีหลายบรรทัด เราจะใช้ Here-Strings (@" "@) แทน ซึ่งเราสามารถวางข้อความหรืออักขระพิเศษอะไรก็ได้ในบลอค Here-Strings



 ...

แล้วเจอกันบทความหน้าครับ

วันเสาร์ที่ 21 พฤศจิกายน พ.ศ. 2558

Write clean Powershell code [Part 3]


7. ใช้ `n เพื่อขึ้นบรรทัดใหม่




8. ใช้ [void] หรือ Out-Null แทน Clear-Host เมื่อไม่ต้องการแสดง Output


9. ใช้ -ErrorAction SilentlyContinue เมื่อจำเป็น

    บางครั้งเราทราบอยู่แล้วว่า Error ที่จะเกิดขึ้นนั้นคืออะไร ซึ่ง Error ที่เราเจอกันบ่อย ๆ คือ Permission Denied หรือ Access Denied อย่างเช่นตัวอย่างนี้


     เราสามารถใช้ -ErrorAction SilentlyContinue เพื่อยกเลิกการแสดง Error ที่จะเกิดขึ้นได้



10. ใช้ Join-Path แทนการเอา Path มาบวกกัน

วันศุกร์ที่ 20 พฤศจิกายน พ.ศ. 2558

Write clean Powershell code [Part 2]


4. หลีกเลี่ยงการใช้ backticks ( ` )

    บ่อยครั้งที่เราต้องเขียนคำสั่งที่ต้องใช้ parameter เยอะ ๆ ทำให้บรรทัดล้นแล้วจะใช้ backticks แก้ปัญหาในการขึ้นบรรทัดใหม่ เรามาดูกันว่าเราจะทำอย่างไร ถ้าไม่ใช้ backticks


5.หลีกเลี่ยงการใช้ pipelines ( | )

    สำหรับข้อมูลที่มีขนาดใหญ่ การใช้ pipelines นั้น อาจจะได้ผลลัพธ์ตามความต้องการ แต่เมื่อเกิดปัญหาแล้วความยากในการ Debug ก็มีเพิ่มมากขึ้นด้วย อีกทั้งยังมีผลในเรื่อง Performance ที่ใช้เวลาในการรันสคริปนานกว่าเดิม และนี่เป็นตัวอย่างง่าย ๆ ของการหลีกเลี่ยงการใช้ pipelines


*อยากให้เราลองจินตนาการดูว่า ถ้าสคริปมีหลายบรรทัด และเกือบทุกบรรทัดมีการใช้ pipelines จะทำให้ความยากในการอ่านสคริป หรือ Debug นั้นยุ่งยากและซับซ้อนมากแค่ไหน

6.  หลีกเลี่ยงการประกาศตัวแปรหลาย ๆ ตัวที่มี Value เดียวกันในแต่ละบรรทัด


*เขียนบทความนี้แล้วก็อย่าลืมกลับไปแก้สคริปเก่า ๆ เพื่อฝึกฝนกันด้วยนะครับ แล้วเจอกันบทความหน้า

วันอังคารที่ 17 พฤศจิกายน พ.ศ. 2558

Write clean Powershell code [Part 1]


1. อย่าใช้ alias

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


เรามาดูตัวอย่างกันดีกว่าครับ แล้วลองสังเกตดูว่าโค้ดแบบไหนที่น่าอ่านกว่ากัน


2. ระบุ parameter ให้ชัดเจน


3. เว้นวรรคและย่อหน้า


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

    ...แล้วเจอกันใหม่บทความหน้ากับ Write clean Powershell code [Part 2] ครับ

วันอาทิตย์ที่ 8 พฤศจิกายน พ.ศ. 2558

Zip ไฟล์กับ Powershell


    อีกหนึ่งทางเลือกสำหรับการบีบอัดไฟล์โดยที่ไม่จำเป็นต้องใช้ WinRar, WinZip หรือ 7-Zip ก็คือการใช้ Powershell ซึ่งสามารถบีบอัดไฟล์ได้เหมือนกัน แต่ก่อนที่เราจะมา Zip ไฟล์นั้นจะต้องมีไฟล์หรือโฟลเดอร์ที่ต้องการจะ Zip ก่อน เรามาสร้างไฟล์กันเลยครับ


    จากภาพด้านบน เราทำการสร้างโฟลเดอร์ชื่อ ZipFile ที่ Desktop และสร้างไฟล์ชื่อ 1, 2, ..., 10 เพื่อเตรียมความพร้อมก่อนจะ Zip ไฟล์ครับ และนี่คือหน้าตาไฟล์ที่เราได้เตรียมไว้


    ต่อมาจะทำการ Zip ไฟล์บนโฟลเดอร์ ZipFile วางไว้ที่ Desktop 


    และนี่คือผลลัพธ์ที่ได้ครับ


    ทีนี้ เรามาลองแตกไฟล์กลับไปที่โฟลเดอร์เดิมกันครับ


    สังเกตว่าเราได้ทำการลบไฟล์ทั้งหมดบนโฟลเดอร์ ZipFile และแตกไฟล์กลับไปที่โฟลเดอร์เดิมครับ

วันเสาร์ที่ 7 พฤศจิกายน พ.ศ. 2558

MessageBox กับ Powershell


    ก่อนที่จะเริ่มใช้คำสั่งเพื่อแสดง MessageBox นั้น เราต้องโหลดคลาสของ .NET Framework มาก่อน นั่นก็คือใช้คำสั่งตามรูป


    จากภาพ เราจะสังเกตเห็นว่าคำสั่งทั้ง 3 คำสั่งที่ได้รันไปทั้งหมดนั้นเป็นคำสั่งสำหรับโหลด Assembly ที่ชื่อ System.Windows.Forms โดยคำสั่งที่ 1 จะแสดงผลลัพธ์ออกมาด้วยว่าเราโหลด Assembly มาจากที่ใด แต่คำสั่งที่ 2, 3 ให้ผลบนหน้า Interface ที่เหมือนกัน แต่ต่างกันนิดหน่อยที่ความเร็ว โดยคำสั่งที่ 2 จะใช้เวลาในการรันคำสั่งนานกว่า เพราะมี Pipeline กั้นอยู่ ซึ่งโดยส่วนตัวแล้ว ถ้าเราต้องการนำไปใช้ต่อ ควรเลือกใช้คำสั่งที่ 3 เพื่อโหลด Assembly ครับ


    ภาพด้านบน แสดงให้เห็นถึงตัวอย่างการใช้งาน MessageBox สำหรับ Parameters ที่ใช้ในวงเล็บนั้นมีอยู่ 4 ชนิดด้วยกันนั่นก็คือ Body, Title, Button และ Icon ตามลำดับ ซึ่งแน่นอนว่า Button = 0 จะแสดงผลให้เห็นแค่ OK Button และ Icon = 0 จะแสดงผลให้ไม่แสดง Icon และจะเกิดอะไรขึ้นหากเราคลิกที่ OK button มาดูกันครับ


    หลังจากคลิก OK button แล้วจะเห็นว่าผลลัพธ์ที่ได้คือ OK ตามภาพด้านบน ในส่วนนี้เราสามารถใช้ [void] หรือ | Out-Null เพื่อไม่ให้แสดงผลลัพธ์ได้เหมือนที่ได้อธิบายไว้ด้านบนสุดของบทความนี้ครับ

    เรามาดูกันต่อเลยครับว่า Button และ Icon ทั้งหมดสำหรับแต่ละคำสั่งมีอะไรกันบ้าง






    จากตัวอย่างทั้งหมดจะเห็นว่ามีชนิดของ Button อยู่ทั้งหมด 6 แบบ และชนิดของ Icon ทั้งหมด 5 แบบ สรุปได้ดังนี้

Button

1.OK - 0
2.OK and Cancel - 1
3.Abort, Retry and Ignore - 2
4.Yes, No and Cancel - 3
5.Yes and No - 4
6.Retry and Cancel - 5
 

Icon

1.None - 0
2.Error - 16
3.Question - 32
4.Warning - 48
5.Information  - 64

    จะเห็นว่าแค่เราโหลด Assembly หนึ่งตัวและรันคำสั่งอีกหนึ่งคำสั่ง ก็จะได้ MessageBox ที่สามารถเอาไปทำอะไรได้หลายอย่างมากมาย และสุดท้าย...หวังว่าคงจะเป็นประโยชน์ไม่มากก็น้อยนะครับ

วันพุธที่ 4 พฤศจิกายน พ.ศ. 2558

คลาสที่น่าสนใจใน Get-WmiObject [Part 3]


    บทความนี้จะพูดถึงคลาส Win32_LogicalDisk ซึ่งเป็นคลาสที่จะให้ข้อมูลเกี่ยวกับ Drive ทั้งหมดที่อยู่บนคอมพิวเตอร์ที่รันคำสั่งนี้ ตามภาพเลยครับ


    มาดูกันต่อว่าแต่ละ Drive นั้นมีพื้นที่ทั้งหมดและพื้นที่ว่างอย่างละเท่าไร


    สุดท้ายแต่ไม่ท้ายสุด สรุปข้อมูลที่น่าสนใจในคลาสนี้ครับ


    สุดท้ายแล้ว ขอฝากข้อมูลสำคัญที่เกี่ยวข้องกับคลาส Win32_LogicalDisk เอาไว้ตรวจสอบว่า Drive ใดเป็น Drive ที่มี File System อยู่