วันเสาร์ที่ 30 เมษายน พ.ศ. 2559

เปลี่ยน Label, DriveLetter ในเครื่องของเราด้วย Method Put() บน WMI กันดีกว่า


    ไม่นานมานี้ได้มีโอกาสเขียนสคริปเล็ก ๆ ในการเปลี่ยน DriveLetter ในเครื่อง ซึ่งก็สามารถทำได้หลายวิธี ไม่ว่าจะเป็นการใช้ Diskpart หรือแม้แต่ Method บน WMI ซึ่งบทความนี้เราจะมาใช้ Method บน WMI กันครับ

    ก่อนอื่น เรามาดูข้อมูลในแต่ละ Drive กันก่อนซึ่งจะแสดงให้ดูแบบ 4 แบบด้วยกันคือบน This PC, diskpart, Get-WmiObject และคำสั่ง Get-Volume (เฉพาะ Windows Server 2012 R2 and Windows 8.1 ขึ้นไปเท่านั้น) ตามลำดับ





    ตอนนี้เรามาดูวิธีการเปลี่ยน Label กับ DriveLetter กันครับ


    เริ่มต้นด้วยการเลือก Drive ที่เราจะเปลี่ยนก่อนครับ ซึ่งผมเลือกที่จะเปลี่ยน Drive D: ส่วนวิธีการเปลี่ยนและผลลัพธ์ก็เป็นไปตามภาพด้านล่างเลยครับ



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

วันเสาร์ที่ 20 กุมภาพันธ์ พ.ศ. 2559

เขียนฟังก์ชัน Validate-Filename, Validate-Path ง่าย ๆ กันดีกว่า


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

    ปกติเวลาเราใส่อักขระต้องห้ามลงไปก็จะมีข้อความเตือนว่าห้ามใช้ ดังรูป


    ใน Powershell เราสามารถนำฟังก์ชันของ .NET มาใช้ได้ ซึ่งฟังก์ชันที่เราจะเขียนต้องใช้มีอะไรบ้าง ไปดูกันเลยครับ


    จากรูปด้านบนทำให้เราทราบว่าอักขระต้องห้ามนั้นมีอะไรบ้าง ทีนี้เรามาดูฟังก์ชันกันดีกว่า ว่าเป็นอย่างไร


   จากรูปด้านบน เราได้เขียนฟังก์ชันชื่อ Validate-Filename โดยที่ฟังก์ชันนี้ต้องใส่ Parameter ชื่อว่า Name ซึ่งก็คือชื่อไฟล์หรือโฟลเดอร์ที่เราต้องการตรวจสอบ จากนั้นฟังก์ชันจะส่งผลลัพธ์ออกมาว่าชื่อที่เราใช้สามารถใช้งานได้หรือไม่ ไปดูตัวอย่างกันครับ


    ถัดมาเป็นฟังก์ชัน Validate-Path และตัวอย่างครับ



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


วันเสาร์ที่ 30 มกราคม พ.ศ. 2559

วิธีดูไฟล์ข้างใน Folder, subfolder และวิธีเช็คขนาด Folder [Extra]


    บทความก่อนหน้านี้ (นานมาก) ในหัวข้อ "วิธีดูไฟล์ข้างใน Folder, subfolder และวิธีเช็คขนาด Folder" ได้พูดถึงวิธีการวิธีการข้างต้น แบบพื้นฐานด้วยคำสั่งของ Powershell ซึ่งก็สามารถตอบโจทย์ได้ตามที่เราต้องการยกเว้นเรื่องของ "ความเร็ว" ซึ่งในบทความนี้ เราจะมาพูดถึงวิธีที่เช็คขนาดโฟลเดอร์โดยใช้ในการรับข้อมูลที่เร็วขึ้น เราไปดูกันครับ

เริ่มแรก ผมมีโฟลเดอร์นึง ที่มีขนาดตามภาพครับ


เรามาลองเช็คขนาดโฟลเดอร์ด้วยวิธีเดิมในบทความที่แล้ว แล้วลองจับเวลากันครับ ว่าได้ผลลัพธ์เป็นอย่างไร


จากภาพบน จะเห็นว่า ผลลัพธ์ที่ได้ก็คือ โฟลเดอร์มีขนาด 1.50 GB ตรงตามที่เราต้องการ และความเร็วที่ใช้ในการประมวลผลคือ 0.61 วินาที (แอบปัดให้)

ทีนี้เรามาดูอีกวิธีกันครับ วิธีนี้เป็นการใช้ FileSystemObject (FSO) object model เราไปดูกันครับ


ผลลัพธ์ที่ได้ โฟลเดอร์มีขนาดเท่ากัน แต่เวลาประมวลผลนั้นแค่ 0.007 วินาที ซึ่งใช้เวลาต่างกันประมาณเกือบ 100 เท่า ลองจินตนาการดูว่า ถ้าเราต้องการเช็คโฟลเดอร์ที่มีขนาดใหญ่กว่านี้ จะช่วยประหยัดเวลาเราไปมากขนาดไหน ^__^

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

วันเสาร์ที่ 12 ธันวาคม พ.ศ. 2558

กด F5 รัว ๆ ทำเว็บล่มแบบที่เค้าทำกัน สไตล์ Powershell


    มีอยู่ช่วงนึงไม่นานมานี้ได้มีการถล่มเว็บ ๆ หนึ่งโดยการกด F5 รัว ๆ เพื่อให้เว็บมีการเชื่อมต่อจากภายนอกเข้ามาเยอะ ๆ จนเกิดอาการ Over Connection ก็เลยเกิดโจทย์ในหัวว่าถ้าจะใช้ Powershell กดให้ต้องทำอย่างไร เรามาดูวิธีการกันครับ


    ตัวอย่างข้างต้นเป็นการ Activate เบราเซอร์ Firefox ขึ้นมาแล้วทำการกด F5 ครับ ทีนี้ถ้าเราอยากให้กด F5 ทุก ๆ 0.5 วินาที จำนวน 100 ครั้งต้องทำอย่างไร ไปดูกันครับ


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









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

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

วันอาทิตย์ที่ 6 ธันวาคม พ.ศ. 2558

Out-GridView คำสั่งที่ง่าย แต่มีประโยชน์


    โดยทั่วไปเราจะรู้จัก Powershell กันในหน้าตาของจอฟ้า ๆ หรือดำ ๆ แต่ความจริงแล้ว Powershell ยังมีคำสั่งที่ใช้แสดง Output ที่เป็น Graphical ด้วย เรามาดูตัวอย่างกันครับ



    เราสามารถทำการ Sort, Filter ได้บนหน้าต่างนี้ รวมไปถึงเลือกค่าให้ออกมาเป็นผลลัพธ์แสดงบนหน้า Console ได้


     เมื่อเราเลือกค่าและคลิก OK ก็จะได้ผลลัพธ์ออกมาแบบนี้


เราสามารถใส่ค่าพารามิเตอร์เพื่อให้เลือกได้หลายค่าได้อีกด้วย


    ก็จะได้ผลลัพธ์ตามนี้ครับ


เราสามารถนำไปประยุกต์ใช้กับค่าอื่น ๆ ได้ด้วย เช่น


    จะเห็นว่า เพียงแค่เราใส่ | Out-GridView ผลลัพธ์ที่ได้ก็จะแสดงผลออกมาเป็นหน้าตาแบบทีเห็น ซึ่งนอกจากจะดูสบายตาแล้ว ยังเหมาะกับผู้ที่ไม่ถนัดใช้ Sort-Object หรือ Filter ด้วย

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

วันอาทิตย์ที่ 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 ที่สามารถเอาไปทำอะไรได้หลายอย่างมากมาย และสุดท้าย...หวังว่าคงจะเป็นประโยชน์ไม่มากก็น้อยนะครับ