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

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

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


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


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


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


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

วันจันทร์ที่ 26 ตุลาคม พ.ศ. 2558

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

    ต่อกันที่คลาส Win32_PhysicalMemory ซึ่งเป็นคลาสที่จะบอกข้อมูลทุกอย่างของ Memory หรือหน่วยความจำนั่นเอง
    

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


    จะเห็นว่าใน Laptop ที่ผมใช้อยู่นี้มีหน่วยความจำอยู่ทั้งหมด 2 ตัวด้วยกัน โดยแต่ละตัวอยู่ที่ Bank 0 และ Bank 1 และมีหน่วยความจำ 4 GB และ 8 GB ตามลำดับ อีกทั้งยังสามารถบอก Manufacturer, PartNumber และ SerialNumber ได้อีกด้วย






วันเสาร์ที่ 24 ตุลาคม พ.ศ. 2558

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


    มาเริ่มต้นกันที่คลาสแรกที่จะนำเสนอในบทความนี้ นั่นก็คือคลาส Win32_OperatingSystem ชื่อก็บอกอยู่แล้วว่าในนี้จะมีข้อมูลอะไร เราไปดูกันแบบลึก ๆ กันเลยครับ


    ภาพบนเป็นข้อมูลของคลาสนี้แบบคร่าว ๆ ไม่ใช่ทั้งหมด จะเห็นได้ว่าไม่มีอะไรที่น่าสนใจเลย นอกจาก Version 10.0.10240 นันก็คือเวอร์ชันของ Windows ที่กำลังใช้งานอยู่นั่นเอง (ภาพนี้ขอซ่อน S/N ไว้ 2 ชุดนะครับ)


    ถัดมาเป็นคำสั่งแสดงข้อมูลทุกอย่างที่อยู่ในคลาสนี้ ซึ่งในนี้มีข้อมูลพื้นฐานที่น่าสนใจโดยจะสรุปให้ในภาพถัดไปครับ
   

    ข้อมูลที่น่าสนใจหลัก ๆ ก็คงหนีไม่พ้น Caption กับ OS Architecture และขอแถมเรื่อง Memory ด้วยละกันครับ

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

วันอาทิตย์ที่ 18 ตุลาคม พ.ศ. 2558

ส่งเมล์ด้วย Powershell

   
    อีกหนึ่งฟังก์ชันที่ Powershell ทำได้คือการส่งเมล์ มาเริ่มกันเลยครับ


    สำหรับตัวอย่างนี้ ผมขอตั้งค่าให้ซ่อน Error ที่จะเกิดขึ้นเพราะจงใจใส่รหัสผ่านเมล์ผิด (ถ้าใส่ถูกจะไม่มี Error) ซึ่งจากภาพก็ใส่ข้อมูลพื้นฐานที่ใช้ในการส่งเมล์ ไม่ว่าจะเป็นที่อยู่เมล์, เมล์ที่เราต้องการจะส่ง (ส่งหาตัวเอง), Mail server & port, รหัสผ่าน, หัวเมล์ และ ข้อความครับ ส่วน 4 บรรทัดสุดท้ายเป็นคำสั่งหลักที่ใช้ในการส่งเมล์ครับ และนี่คือผลที่ได้รับหลังจากที่เช็คเมล์โดยใช้ Outlook บน IPhone



    ลองเอาไปใช้ดูนะครับ แต่อย่าไป flood เมล์ชาวบ้านเค้าหละ เดี๋ยวโดนแบนขึ้นมาจะหาว่าไม่เตือน