วิธีหาวันที่ เมื่อวานและเดือนก่อนหน้าด้วย batch file

โจทย์ไม่มีอะไรมาก อยากแสดงวันที่ ของเมื่อวานในรูปแบบ YYYYMMDD และ ต้องการแสดงเดือนที่แล้วในรูปแบบ YYYYMM โดยต้องแสดงเป็นปี พ.ศ. ซึ่งวิธีการก็ไม่ยาก เข้า google และไปหาตัวอย่างมาแก้ !! เอ้ย !! ไม่ต้องตกใจ นี่คือทางที่รวดเร็วที่สุดแล้ว มาดูกันว่าเราจะทำอะไรกับ source code ที่คัดลอกมาได้บ้าง

ต้นฉบับ https://www.dostips.com/forum/viewtopic.php?t=6615

@echo off
set day=0
echo >"%temp%\%~n0.vbs" s=DateAdd("d",%day%,now) : d=weekday(s)
echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^& right(100+month(s)-1,2)^& right(100+day(s),2)
for /f %%a in ('cscript /nologo "%temp%\%~n0.vbs"') do set "result=%%a"
del "%temp%\%~n0.vbs"
set "YYYY=%result:~0,4%"
set "MM=%result:~4,2%"
set "DD=%result:~6,2%"
if "%MM%"=="00" set "MM=12" & set /a YYYY=YYYY-1
set "data=%yyyy%%mm%"

echo last year/month was "%data%"
pause

ผลลัพท์ที่ได้คือ "202007"

last year/month was "202007"
Press any key to continue . . .

เดือนที่แล้ว เป็นปี พ.ศ.

ง่ายมาก แค่เปลี่ยนบรรทัดนี้จาก

set "YYYY=%result:~0,4%"

เป็นแบบนี้ ด้วยการ +543 เข้าไป

set /a YYYY=%result:~0,4%+543

จากเดิมมันเป็นการ SET ค่าให้ตัวแปร YYYY โดยนำค่าจาก result ตัวที่ 0 ถึง 4 มาใส่ ส่วนนี้จะเป็น String ล้วนๆ ถ้าเราต้องการใส่ตัวแปรที่เป็น “การคำนวน” หรือ “นิพจน์คำนวณ” (Arithmetic Expressions) เราจำเป็นต้องเติม /A เข้าไปข้างหน้า ไม่งั้นมันจะ error The syntax of the command is incorrect.

คำอธิบายเกี่ยวกับ SET
https://ss64.com/nt/set.html

เมื่อเสร็จสมบูรณ์ก็จะออกมาแบบนี้

@echo OFF
@setlocal EnableDelayedExpansion
@cls
set day=0
echo >"%temp%\%~n0.vbs" s=DateAdd("d",%day%,now) : d=weekday(s)
echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^& right(100+month(s)-1,2)^& right(100+day(s),2)
for /f %%a in ('cscript /nologo "%temp%\%~n0.vbs"') do set "result=%%a"
del "%temp%\%~n0.vbs"
set /a YYYY=%result:~0,4%+543
set "MM=%result:~4,2%"
set "DD=%result:~6,2%"
if "%MM%"=="00" set "MM=12" & set /a YYYY=YYYY-1
set "data=%yyyy%%mm%"

echo last year/month was "%data%"

ผลลัพท์ "256307"

last year/month was "256307"

เมื่อวานนี้ เป็นปี พ.ศ.

เราก็ใช้ code ชุดเดิมได้เลย แค่เปลี่ยนวิธีการคำนวนให้ day=-1 คือการย้อนไป 1 วัน จากเดิม day=0 คือเราไม่ได้สนใจวันที่ แต่เราไป -1 ที่ month แทน ซึ่งคราวนี้เราเอา -1 ที่ right(100+month(s)-1,2) ออก จะได้ right(100+month(s),2) และในส่วนของ data ก็เติม %dd% เข้าไปได้เลย เป็น set "data=%yyyy%%mm%%dd%" code สำเร็จจะออกมาหน้าตาแบบนี้

@echo OFF
@setlocal EnableDelayedExpansion
@cls
set day=-1
echo >"%temp%\%~n0.vbs" s=DateAdd("d",%day%,now) : d=weekday(s)
echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^& right(100+month(s),2)^& right(100+day(s),2)
for /f %%a in ('cscript /nologo "%temp%\%~n0.vbs"') do set "result=%%a"
del "%temp%\%~n0.vbs"
set /a YYYY=%result:~0,4%+543
set "MM=%result:~4,2%"
set "DD=%result:~6,2%"
REM if "%MM%"=="00" set "MM=12" & set /a YYYY=YYYY-1
set "data=%yyyy%%mm%%dd%"

echo yesterday was "%data%"

ผลลัพท์ "25630826"

yesterday was "25630826"

สรุป

Batch file ง่ายนิดเดียว ถ้าเราอ่านคู่มือมันดี ๆ เราจะพบว่ามันทำงานตรงไปตรงมา ไม่บิดเบี้ยวเลยแม้แต่น้อย ซึ่ง code นี้สามารถเอาไปประยุกต์ได้กับการทำ schedule backup, schedule export ซึ่งเราอ้างอิงตัวแปลที่เป็นวันที่และเวลานี่แหละ ใช้กับการเปลี่ยนแปลงได้้เลย ถ้าจะหาพรุ่งนี้ เดือนหน้า ก็ +1 กันเข้าไป

Cover Image
Calendar vector created by pch.vector – www.freepik.com