1. 設計功能
將整年份計畫事項,包含每月一次或每單月一次,每雙月一次之固定日期將來臨前,需要事先準備執行的事項,先一件一件記入在文字檔內,以便能該事件來臨前幾天,以LINE訊息自動發送出該事件內容給群組全員,讓全員可以事先接到通知,事先做好準備,才不會遺忘重要計畫事件。
本件適用於各團體單位,尤其是年度內有許多定例計劃事項,需按時執行或舉辦之各種活動。
2. 作業說明
2.1 讀取參數檔內含送信日,與計畫事項之訊息內容
先Read 取得 input file內多筆Plan do 事項 ( input file: LINE_send_notify_par-LIN.txt)
讀取方法:
FOR /F "tokens=1,2* delims=?" %%i in ('findstr /C:"D?" LINE_send_notify_par-LIN.txt' ) do ( CALL :PlanDo %%j "%%k" )
2.2 計畫事項取得處理 (CALL :PlaDo )
2.2.1 取得計畫事項之日期與事項內容
<1>日期 : set par_md=%1
該事件訊息於何日會發送出LINE訊息,依據%1 參數取得後,再判斷取得%1當日,與其前一天,共取得兩次發送日,即該事件將會連續兩天發出LINE訊息
<2> 內容: set par_message=%2
該事件訊息內容,依據%2 參數取得
2.2.2 送信日的前一日之取得處理
判斷今日是否為 發送日之前一日
STEP1.0,0 檢查par 日期 是否正確判斷
STEP1.0,1 par前一日之篩選出範圍內
STEP1.0.2 根據par_dd 前一天,得send_dd ex.om14/ em14/ mm14 /0814
根據par_mm, 取得send_mm
當前一日send_dd==00 特別處理 變為前月之第一日 ( CALL :LastM_FinalDay )
STEP1.0.3 若par前一天 ==今日,取得send訊息追加出力par檔 (當%send_mm%=99 不會send)
2.2.3 送信日為當日之取得處理
判斷今日是否為 發送日
STEP1.1,1 par當日之篩選出範圍內, 此時send_mm 為 上步驟 取得par前一日之月份
STEP1.1.2 根據par 取得par當日之send_dd
STEP1.1.3 若par日期 ==今日,取得send訊息追加出力par檔 (當%send_mm%=99 不會send)
2.3 取得LINE send訊息後,執行LINE傳送程式 (CALL python exe檔 )
2.3.1 發送LINE訊息內容於2.2 已取得
2.3.2 欲發送給哪個LINE群組 之 token 序號出力至LINE傳送參數檔
(echo T,xxxxxxxxx3cs>> LINE_send_notify_par.txt)
2.4 上述內容之詳細指令,請参考下面第四点bat設計
3. 實例說明
3.1 PlanDo 計畫事項之txt檔案內容,依據個別需要,自行制訂年度計劃事項,可追加刪除,並且該計畫內容可多年使用
即入力檔 ( LINE_send_notify_par-LIN.txt) 內容 如下:
D?mm14?每月18日前繳、玉山信用卡費
D?mm26?每月29日前繳、百管費
D?mm28?每月30日前繳、聯邦,華南,兆豐信用卡
D?om19?單月21日前繳、水費
D?em24?雙月28日前繳、電費
D?em26?雙月28日前繳、國保費
D?0423?每年 4月30日前繳,機車及汽車牌照稅
D?0523?每年 5月28日前繳,機車及汽車保險
D?0525?每年 5月31日前繳,所得稅,及房屋稅
D?0526?每年 5月31日郵局轉帳,房屋稅
D?0727?每年 7月31日前繳、機,汽車燃料稅
D?0729?每年 8月01日前,掛號信轉址申請
D?0903?每年 9月07日郵局轉帳、新光保險費
D?1019?每年10月23日郵局轉帳,新光保險費
D?1126?每年11月30日郵局轉帳、地價稅
D?1009?每年舊曆9/9先祖忌拜
3.2 本例執行後,發送出LINE訊息
依據上述檔案內之
D?0523?每年 5月28日前繳,機車及汽車保險
因本日5/22,故於5/22,5/23連續兩天,都會發出LINE訊息內容如下:
4 執行檔bat 設計內容如下 :
@ECHO OFF
REM ---2個入力檔(1)LINE_send_notify_par.txt Python程式用 (2)LINE_send_notify_par-LIN.txt 計畫事日期
rem ---注意: par txt file 之傳送內容不可有 ( 或 ) ,因 cmd 會錯亂致當掉 ---
d:
rem cd D:\HTW-IT\LINEN
cd D:\lin_PC\cmd-bat\bat\LINE_Notify\LIN
set send_mm=99
set send_dd=88
set oem=nul
set send_F=N
set T_mm=%DATE:~5,2%
set T_dd=%DATE:~8,2%
::---判斷今日是奇月odd 或偶月even---
echo %T_mm% | findstr "02 04 06 08 10 12"
if %errorlevel%==0 set oem=even
rem Note---LINE_notify_par第一行空值不可, 右邊錯誤---echo.> LINE_send_notify_par.txt
echo M,> LINE_send_notify_par.txt
REM -----STEP1 Read 取得par file內多筆Plan do 事項 -----
FOR /F "tokens=1,2* delims=?" %%i in ('findstr /C:"D?" LINE_send_notify_par-LIN.txt' ) do ( CALL :PlanDo %%j "%%k" )
REM -----STEP2 取得send訊息後,執行傳送訊息LINE群組for python)---
if %send_F%==Y (
echo T,e7iEtrrrrrrrrrrrrrr5qEa0luu>> LINE_send_notify_par.txt
CAll LINE_send_notify.exe )
rem pause job end-----
EXIT
:PlanDo
set par_md=%1
set par_message=%2
set par_message=%par_message:"=%
set par_mm=%par_md:~,2%
set par_dd=%par_md:~2,2%
REM -----STEP1.0,0 檢查par 是否正確
echo %par_mm% | findstr "mm em om"
if %errorlevel%==0 (goto par_mmOK
) else ( if %par_mm% GTR 00 (
if %par_mm% LSS 13 (goto par_mmOK) else (echo ### ERROR par_mm 大於12 & goto PlanDo_Exit)
) else ( echo ### ERROR par_mm 小於00 & goto PlanDo_Exit ) )
:par_mmOK
if %par_dd% GTR 00 (
if %par_dd% LSS 32 (goto par_ddOK ) else (echo ### ERROR par_dd 大於31 & goto PlanDo_Exit )
) else ( echo ### ERROR par_dd 小於00 & goto PlanDo_Exit )
:par_ddOK
REM -----STEP1.0,1 par前一日之判斷是否要送信???
if NOT %par_mm:~1,1%==m (
if NOT %par_mm%==%T_mm% (
if NOT %par_dd%==01 goto PlanDo_Exit )
)
REM -----STEP1.0.2 根據par_dd 前一天,得send_dd ex.om14/ em14/ mm14 /0814
::---Note 08, 09 cannot compute, change to 8,9; 計算後小於10 補0,00 保留
set send_dd=%par_dd%
if %par_dd:~,1%==0 ( set send_dd=%par_dd:0=% )
set /a send_dd=%send_dd% - 1
if %send_dd% LSS 10 (set send_dd=0%send_dd% )
::-----根據par_mm, 取得send_mm
if %par_mm:~1,1%==m ( CALL :MM_OM_EM %par_mm%
) else ( set send_mm=%par_mm% )
if %send_mm% NEQ 99 (
if %send_dd%==00 ( CALL :LastM_FinalDay %send_mm% ) )
REM -----STEP1.0.3 若par前一天 ==今日,取得send訊息追加出力par檔 (當%send_mm%=99 不會send)
if %T_mm%==%send_mm% (
if %T_dd%==%send_dd% (
echo M,%par_message%>> LINE_send_notify_par.txt
set send_F=Y ))
rem pause --- step 1.0.3 chk
REM -----STEP1.1,1 par當日之判斷是否要送信??? (此時send_mm 為par前一日之月份)
if NOT %par_dd%==%T_dd% ( goto PlanDo_Exit
) else (
if NOT %par_dd%==01 (
if NOT %send_mm%==%T_mm% goto PlanDo_Exit )
)
REM -----STEP1.1.2 根據par 取得par當日之send_dd
set send_dd=%par_dd%
::-----根據par_mm, 取得send_mm
if %par_mm:~1,1%==m ( CALL :MM_OM_EM %par_mm%
) else ( set send_mm=%par_mm% )
REM -----STEP1.1.3 若par日期 ==今日,取得send訊息追加出力par檔 (當%send_mm%=99 不會send)
if %T_mm%==%send_mm% (
if %T_dd%==%send_dd% (
echo M,%par_message%>> LINE_send_notify_par.txt
set send_F=Y ))
:PlanDo_Exit
rem pause --- step 1.1.3 chk
exit /b
:MM_OM_EM
set send_mm=99
if %1==mm (set send_mm=%T_mm% & goto BRK )
if %oem%==even (
if %1==em (set send_mm=%T_mm%
) else ( goto BRK)
) else (
if %1==om (set send_mm=%T_mm% )
)
:BRK
exit /b
:LastM_FinalDay
set send_mm=%1
if %send_mm:~,1%==0 ( set send_mm=%send_mm:0=% )
set /a send_mm=%send_mm% - 1
if %send_mm% LSS 10 (set send_mm=0%send_mm% )
rem FOR /F "tokens=1 delims= " %%i in ('echo %send_mm% ^| findstr "04 06 09 11" ') do ( set send_dd=30 )
rem ---不可 ^| 因errorlevel 結果取得都會0
echo %send_mm% | findstr "04 06 09 11"
if %errorlevel%==0 (
set send_dd=30
) else ( set send_dd=31 )
if %send_mm%==02 (
set send_dd=28
) else (
if %send_mm%==00 (set send_mm=12 ) )
exit /b
5 自動排程設定
上述執行檔bat設定於Windows自動排程,讓它能自動執行,若該日是發送日,將自動發送LINE訊息至設定的LINE群組,以達到能主動事先發送LINE訊息之功能。
-------recorded by linct ------