วิธีการสร้าง Batch Script File แบบพื้นฐาน

Mr.Rukpong
Arcadia Software Development
4 min readDec 31, 2018

จากบทความก่อนเรื่องคำสั่งการใช้งาน Command Line ขั้นพื้นฐาน อาจจะทำให้พอเข้าใจคำสั่งการทำงานของ Computer ในระบบปฏิบัติการ Windows กันบ้างแล้ว

ถ้าใครยังไม่เคยอ่านคำสั่ง Command Line ขั้นพื้นฐาน หรือจำคำสั่งพื้นฐานไม่ได้ ก็สามารถกลับไปอ่านได้เลยครับ

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

Level 1: เริ่มต้นจากการนำคำสั่งพื้นฐานง่ายๆ มาเรียงต่อกัน

  • เริ่มต้นง่ายที่สุดโดยการเปิดโปรแกรม Notepad ขึ้นมา และพิมพ์ Command พื้นฐานลงไป
cd C:\Users\User\Desktop
mkdir TestFolder
echo some text > TestFolder\testFile.txt
dir TestFolder

บรรทัดแรก สั่งให้เข้าไปยัง Directory Desktop

บรรทัดที่สอง สั่งให้สร้าง Directory ชื่อ TestFolder

บรรทัดที่สาม สั่งให้สร้าง File ใน Directory TestFolder และใส่ข้อความ some text

บรรทัดสุดท้าย สั่งให้แสดงรายการ File และ Directory ที่อยู่ใน Directory TestFolder

*ตามคำสั่งพื้นฐานที่อธิบายไว้ใน Blog Command Line พื้นฐาน

  • ต่อจากนั้น Save ไฟล์ด้วยนามสกุลไฟล์เป็น .bat เพื่อกำหนดให้ไฟล์นี้เป็น Batch script แล้วเราจะได้ไฟล์แบบนี้
  • ขั้นต่อไปลอง Double click เพื่อสั่งรัน Script ที่เราสร้างไว้ และดูผลลัพธ์ จะสังเกตเห็นว่ามี Folder ถูกสร้างขึ้นมาและ File ข้างใน Folder นั้นอีกทีดังนี้

เท่านี้เราก็เริ่มทำ Batch script พื้นฐานกันได้แล้ว แต่สงสัยไหมว่า แล้วคำสั่งสุดท้ายของเรา

dir TestFolder

ทำไมถึงไม่แสดงรายการ File และ Directory ที่อยู่ใน Directory TestFolder ความจริงแล้ว มันแสดงแล้วครับ แต่ด้วยความที่ Script มันรันเร็วมาก ทำให้เรามองไม่ทัน เราต้องใส่คำสั่ง pause ใน Script เพื่อหยุดแสดงผลลัพธ์ให้เราก่อนครับ

Level 2: เริ่มเขียนคำสั่งเฉพาะภายใน Batch Script File

  1. คำสั่ง Pause

เริ่มจากปัญหาเมื่อกี้ เราสามารถใส่คำสั่ง pause เพิ่มเข้าไปใน Script เพื่อให้ Command หยุด โดยการคลิกขวาที่ Script > Edit จะขึ้นหน้าต่าง Notepad ขึ้นมาให้เราสามารถแก้ไขได้ครับ

cd C:\Users\User\Desktop
mkdir TestFolder
echo some text > TestFolder\testFile.txt
dir TestFolder
pause

จะทำให้ Script หยุดทำงานชั่วคราว และแสดงผลให้เราดูก่อนดังนี้

Directory of C:\Users\User\Desktop\TestFolder29-Dec-18  10:03 PM    <DIR>          .
29-Dec-18 10:03 PM <DIR> ..
31-Dec-18 02:11 PM 12 testFile.txt
1 File(s) 12 bytes
2 Dir(s) 64,190,902,272 bytes free

2. คำสั่ง echo off

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

echo offcd C:\Users\User\Desktop
mkdir TestFolder
echo some text > TestFolder\testFile.txt
dir TestFolder
pause

ทีนี้ คำสั่ง cd, mkdir, echo, dir ก็ไม่แสดงแล้ว จะเหลือแต่ผลลัพธ์แสดงบนหน้าจอ

แต่จะเห็นว่า แล้วคำสั่ง echo off ล่ะ ก็ยังคงแสดงอยู่

C:\Users\User\Desktop>echo off

เราก็สามารถใช้คำสั่ง echo off กับตัวมันเองได้ โดนการใช้ @ ดังนี้

@echo offcd C:\Users\User\Desktop
mkdir TestFolder
echo some text > TestFolder\testFile.txt
dir TestFolder
pause

เท่านี้คำสั่ง echo off ก็จะไม่แสดงบนหน้าจอแล้ว

3. คำสั่ง rem

การ Comment คำสั่งที่อยู่ภายใน Script เมื่อเราไม่ต้องการรันคำสั่งนั้น แต่ยังไม่อยากลบออกจาก Script

เช่น Script ที่เรากำลังรันอยู่จะสังเกตเห็นว่าคำสั่ง mkdir จะพยายามสร้างไฟล์ทุกครั้งที่เรารัน แต่ในหน้าจอจะแสดงข้อความบอกเราว่า A subdirectory or file TestFolder already exists. ดังนั้นเราสามารถใช้คำสั่ง rem เพิ่มเข้าไป เพื่อให้ Script ไม่ต้องรันคำสั่ง mkdir ได้ดังนี้

@echo offcd C:\Users\User\Desktop
rem mkdir TestFolder
rem echo some text > TestFolder\testFile.txt
dir TestFolder
pause

ทีนี้หน้าจอจะแสดงผลเหลือแต่เฉพาะผลลัพธ์ของคำสั่ง dir แล้วครับ

4. คำสั่ง set

การกำหนดตัวแปรให้กับ Script ของเราด้วยคำสั่ง set เราจะลองสร้าง Batch Script File ใหม่ขึ้นมา เพื่อ Script เราจะได้ไม่รกมากจนเกินไป

@echo off
set message=test some message
echo %message%
pause

คำสั่ง set จะกำหนดตัวแปรเพื่อเก็บค่าทางด้านขวาไว้ และเมื่อจะเรียกใช้ตัวแปรนั้นเราจะใส่ % ให้มันอย่างเช่น ตัวอย่างข้างต้น เราเก็บข้อความ test some message เอาไว้ในตัวแปร message เมื่อเราจะเรียกใช้ เราจะใส่ % ให้มัน %message% ผลลัพธ์ก็จะได้ดังนี้

test some message
Press any key to continue . . .

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

Level 3: คำสั่ง For Loop ใน Batch Script File เพิ่มช่วยในการ check หรือค้นหา File ภายใน Directory นั้นๆ ได้

เราจะเริ่ม advance กันแล้วนะครับ For Loop คือการทำงานวนซ้ำในขอบเขตที่เรากำหนด ลองเขียน Script ให้แสดงผลลัพธ์ตัวเลข 1- 10 ด้วยการใช้คำสั่ง For Loop จะได้ดังนี้ครับ

@echo off
for /l %%n in (1,1,10) do (
echo %%n
)
pause

จะอธิบายคร่าวๆ ของ Script นี้นะครับ

คำสั่ง for จะต้องใส่รายละเอียดและขอบเขตการทำงานไปด้วยครับ โดย

/l จะใส่กำกับเพื่อบอกให้ for loop รู้ว่าข้อมูลเป็นตัวเลข

%%n จะเป็นตัวแปรที่จะเก็บค่าที่เปลี่ยนไปภายใน loop นี้

in (1,1,10) คือในวนคำสั่งทำงานตามนี้คือ เริ่มที่ 1 เพิ่มที่ละ 1 จนถึง 10 ตามลำดับ

do จะบอกว่าในการวน loop ในรอบหนึ่งต้องการให้ทำคำสั่งอะไร (ในที่นี้สั่งให้แสดงตัวแปรที่เก็บค่าที่เปลี่ยนไปในแต่ละรอบ)

ทั้งหมดจะทำให้ได้ผลลัพธ์ที่แสดงวนไปเรื่อยๆ ตั้งแต่ 1- 10

1
2
3
4
5
6
7
8
9
10
Press any key to continue . . .

ทีนี้เราจะลองนำความรู้ว่าจากคำสั่ง For Loop มาปรับใช้ในการ copy, move, delete File กันนะครับ จะลองยกตัวอย่าง Script ที่นำเรื่อง For Loop มาปรับใช้

  • เริ่มต้นจากการที่เราใช้ For Loop มาสร้างไฟล์ ทั้งหมด 10 ไฟล์
@echo off
cd C:\Users\User\Desktop
mkdir FolderLoop
for /l %%n in (1, 1, 10) do (
echo some text %%n > "FolderLoop\File_%%n.txt"
)
pause

ถ้าสังเกตดูจะเห็นว่าเป็นการนำคำสั่งมารวมกันเท่านั้นเอง โดยใน Script นี้ จะสั่งให้สร้าง Directory FolderLoop ขึ้นมา และสร้างไฟล์ File_1.txt จนถึง File_10.txt เริ่มเห็นแล้วยังครับ ว่า Script ช่วยลดเวลาเราได้เยอะเลย (ถ้าเราต้องการต้องเป็น 100 ไฟล์ ก็แค่เปลี่ยนให้เป็น 100 รอบ “in (1, 1, 100)” ไฟล์ก็ถูกสร้างออกมาเป็น 100 ไฟล์แล้วครับ ใช้เวลาแค่แปปเดียวด้วย

  • ลองนำมาปรับใช้กับคำสั่ง copy, move, delete กันดูบ้าง
@echo offcd C:\Users\User\Desktop\FolderLoop
mkdir C:\Users\User\Desktop\FolderArchive
set archivePath=C:\Users\User\Desktop\FolderArchive
for /l %%n in (1, 1, 10) do (
if File_%%n.txt == File_10.txt (
copy File_%%n.txt File_%%n_copy.txt
)

if File_%%n.txt == File_1.txt (
del File_1.txt
) else (
move File_%%n.txt %archivePath%\File_%%n.txt
)
)
pause

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

เริ่มต้นคือสร้าง Directory ใหม่เพื่อเตรียมสำหรับการ Archive File และเข้า For Loop ธรรมดา 10 รอบและในแต่ละรอบมีการทำงานดังนี้

คำสั่ง if เป็นตัว check ชื่อไฟล์ เพื่อแยกการทำงานของแต่ละไฟล์ซึ่งกำหนดให้ทำงานต่างกัน

if File_%%n.txt == File_10.txt (
copy File_%%n.txt File_%%n_copy.txt
)

กำหนดว่า ถ้าใน Loop แต่ละรอบ ชื่อไฟล์ตรงกับ File_10.txt ให้ทำงาน ภายในวงเล็บนั้น ซึ่งก็คือ Copy File เป็น File_10_copy.txt

if File_%%n.txt == File_1.txt (
del File_1.txt
) else (
move File_%%n.txt %archivePath%\File_%%n.txt
)

กำหนดว่า ถ้าใน Loop แต่ละรอบ ชื่อไฟล์ตรงกับ File_1.txt ให้ทำงาน ภายในวงเล็บนั้น ซึ่งก็คือ ลบไฟล์ File_1.txt

แต่ถ้าชื่อไฟล์ไม่ตรงกับ File_1.txt ให้ทำงานใน else (วงเล็บที่สอง) ซึ่งก็คือ ย้ายไฟล์ไป Archive ใน Directory ที่เราสร้างขึ้นมาใหม่

ผลลัพธ์ที่ได้ก็จะเป็นดังนี้

> ใน FolderArchive จะได้ไฟล์ที่เราสั่งย้ายไปทั้งหมด

C:\Users\User\Desktop\FolderArchive>dir /b
File_10.txt
File_2.txt
File_3.txt
File_4.txt
File_5.txt
File_6.txt
File_7.txt
File_8.txt
File_9.txt

> ใน FolderLoop จะเหลือแค่ File_10_copy.txt ที่เราสั่ง copy ไว้

C:\Users\User\Desktop\FolderLoop>dir /b
File_10_copy.txt

ถึงซับซ้อน แต่รวดเร็ว เพียงแค่เราเขียน Batch Script File สั่งงาน และ Condition ไว้สำหรับคำสั่งที่ต่างกัน ก็ทำให้เราสั่งให้ทำงานแทนเราได้อัตโนมัติแล้วล่ะครับ

นอกจากนี้ ยังมีคำสั่งอีกหลากหลายให้เรานำมาปรับใช้กับคำสั่งอัตโนมัติของเรา ยิ่งเราศึกษามากขึ้น เราจะยิ่งนำมาใช้ได้ยืดหยุ่นมากขึ้นครับ

ระบบ Computer มีอะไรสนุกให้ลองเล่นเยอะแยะเลย ถ้าสนใจทดลองและฝึกฝน ก็สามารถนำไปต่อยอดได้

Batch Script File อาจจะช่วยลดงาน Archive File หรือการจัดการ File ต่างๆ ได้ บทความถัดๆ ไป อาจจะมีการเขียนระบบ Archive File พื้นฐานด้วย Python ซึ่งจะง่ายกว่า Script เยอะเลย โปรดติดตามตอนต่อไป…

--

--