バッチ処理で正確に1Sec間隔でモニターして処理できるようにする(pythonによる補助)

# 「このプロジェクトは自動保存機能を実装するバッチファイルとPythonスクリプトを紹介します。」
一応、全ファイルを参考として載せておきます。
### 　ディレクトリー構成
・C:\ +   一応、どこにおいても動作しますが、ドキュメントは避けた方が良いです。理由。ディスプレーは固有のPC環境にある。
　+Auto_Save+暫定的命名　プロパティの書き込み禁止を最終的に解除しておく 
　+ +auto_save.png アイコン制作時の元イメージ1
　+ +lockfile_m.lock　ロック用masterファイル
　+ +lockfile.lock　ロックファイル　メイン用 
　+ +lockfile1.lock　ロックファイル1 タイマー用
　+ +python_get_time.py 後で説明
　+ +save_ranning.ico アイコンsaving.bat用
　+ +saving.bat 後で説明
　+ + [saving.bat - ショートカット] saving.bat -s スタートswitch付
　+ +saving　(seving.bat icon付ディスクトップ配置用)
　+ +Stop_go_Work.ico　アイコン　切り替え表示で動作状態を出している
　+ +Stop_S_work.png アイコン制作時の元イメージ2
　+ + [saving.bat - ショートカット] saving.bat -n ノンストップswitch予定だったが無い。
　+ +timed_saving_p.bat 後で説明 これが題名のfile
　+ +timed_saving.bat 仕上げる前のバッチ
　+ 
　+ +me_Looking_to.txt 一応、後助のために置いておく
### me_Looking_to.txt
~~~TXT me_Looking_to.tx
saving(.lnk)オンリー。icon「save_ranning.ico　Working」icon「Stop_go_Work.ico　Stop」ディスプレオンリーicon
work　C:\Auto_Save\saving.bat 　 only lock    no moniter
　    C:\Auto_Save\saving.bat -n only unlock  moniter
..ユーザー/名前/(AppData)/Roaming/Microsoft/Windows/スタートメニュー/プログラム/スタートアップ/[saving.bat - ショートカット(-s)]アイコンをdrop
lockfile.lockとlockfile_m.lockは空のtextファイルを変名して必ず作ってやる。なお、かってながらname_mの_mはマスターの印。

~~~

![auto_save.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/0f1f9d2b-2a33-bd36-8962-e245ceff345d.png) ![Stop_S_work.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/f005df27-1902-dc3a-846a-ac3509d4528f.png)

### アイコンにしたいbatを選択して「右クリック・「ショートカットの作成」」で作ってから
![スクリーンショット 2024-12-13 214119.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/a7feb9ff-19d2-3885-4307-e73ea9045ca4.png)
コマンドswitchを足しておくこともできます。( -n)

# 「以下のバッチファイルはタイマーの設定を行い、指定の間隔でPythonスクリプトを実行します。」
## timed_saving_p.bat [ANSI(Shift-JIS)]save
~~~BAT timed_saving_p.bat
@echo off
setlocal
REM ロックファイルの作成 
set lockfile1="%~dp0lockfile1.lock" 
if not exist %lockfile1% ( 
   copy "%~dp0lockfile.lock" "%~dp0lockfile1.lock"
) else (
   exit /b 0
)
REM セッティング間隔（秒単位） 
set /a my_kankaku=30 

REM 変数の初期化 
set /a add_1=0 
set /a add_2=0
set /a my_1=0
set /a my_2=0

set /a current_seconds0=0
set /a total_seconds1=0
REM 間隔を時、分、秒に分解 
set /a my_h=my_kankaku/3600 
set /a my_m_k=my_kankaku-(my_h*3600) 
set /a my_m=my_m_k/60 
set /a my_s=my_m_k-(my_m*60)
REM 現在の時間を秒単位で取得 
:now_time_get 
REM 現在の時間を再度取得
set time1=%time: =0%
rem 「time」から切り出した数字をそれぞれ変数に代入
set hh=%time1:~0,2%
set mm=%time1:~3,2%
set ss=%time1:~6,2% 
set ima_time=%hh%:%mm%:%ss%
echo 現在時刻: %ima_time%
set /a hojyo1=0 
set /a hojyo2=0 

if %hh% geq 23-my_h if %mm% geq %my_m% if %ss% geq %my_s% (
 set /a hojyo1=1 
) 
if %hh% leq %my_h% if %mm% leq %my_m% if %ss% leq %my_s% (
 set /a hojyo2=24 
)
REM 
set /a total_seconds1=(hh*3600)+(mm*60)+ss+(hojyo1*3600*24) 
set /a total_seconds2=%total_seconds1%+%my_kankaku%+(%hojyo2%*3600*24)

REM 計算結果を表示 
echo 現在の時間（秒単位）: %total_seconds1% 
echo %my_kankaku%秒後の時間（秒単位）: %total_seconds2%
REM pause

REM 引数をチェック 
set /a one_end=0 
goto one_now

:one_now
if "%1" == "-s" (
    set /a one_end=1
    goto work_one
) else (
    goto check_time
)
goto end_reqest

:check_time
REM Pythonスクリプトを実行 
for /f "tokens=*" %%i in ('python python_get_time.py') do set current_time=%%i 
REM タイムスタンプを表示 

REM 現在の時間を再度取得
set time2=%time: =0%
rem 「time」から切り出した数字をそれぞれ変数に代入
set ha=%time2:~0,2%
set ma=%time2:~3,2%
set sa=%time2:~6,2% 
set millisecond_x4=%time2:~9,3%



set time3=%ha%:%ma%:%sa%
REM 奇数か偶数かの判定 
set /a kisuu=sa%%2 
if %kisuu% equ 0 ( 
REM 偶数の場合の処理 
    set /a add_2=0
	if %add_2% equ 0 (
	    if %add_1% equ 0 (
		    set /a add_1=1
		    goto all_0
		)
	)
   	
) else ( 
REM 奇数の場合の処理  
    set /a add_1=0
    if %add_1% equ 0 (
	    if %add_2% equ 0 (
		    set /a add_2=1
		    goto all_0
		)
	)    
)
goto check_time
:all_0
set /a my_1=my_1+1
if %sa% equ 2 (
    echo min=02sec
    set /a my_1=2
)
if %my_1% equ 10 (
    echo Plese enykye it 09Sec
    pause
)else (
    echo The second is not 09 
)
if %sa% neq %current_seconds0% (
    set a/ current_seconds0=%current_seconds%
) else (
    goto check_time
)
set /a current_seconds=(ha*3600)+(ma*60)+sa
REM 足されているime2から0:00:00に一日分引いてしまう。引いた残りの数が必要な数。
if %ha% equ 0 if %my_m% equ 0 if %sa% geq 0 (
    if 86400 geq %total_seconds2% (
        set /a total_seconds2=%total_seconds2%-86400
    )
)
echo 現在のタイムスタンプ: %current_time% 
REM タイムスタンプを解析して変数に格納 
set hour=%current_time:~0,2% 
set minute=%current_time:~3,2% 
set second=%current_time:~6,2% 
set millisecond=%current_time:~9,3%
REM 解析結果を表示 
echo pyton_時間: %hour% 分: %minute% 秒: %second% ミリ秒: %millisecond%
echo t0 %time3% t0 %current_seconds% t2 %total_seconds2% plese mille_x4 %millisecond_x4% my_1=%my_1%
REM test
if not exist "%~dp0lockfile.lock" (
    set one_end=1
    goto work_one
)


REM 1秒
set /a my_t_hojyo=current_seconds+my_kankaku
set /a my_t_hojyo1=%my_t_hojyo%
if %total_seconds2% leq %current_seconds% (
    set /a total_seconds2=%my_t_hojyo% 
	set /a total_seconds3=%my_t_hojyo1% + %my_kankaku%
    echo it work  halo world! %time3% %current_seconds% OK %total_seconds2% nex %total_seconds3%
    goto work_one
)
goto check_time

:work_one
REM 時間が来たら
echo 処理をします。
powershell [console]::beep(1000,300)
if %one_end% equ 1 (
    goto end_reqest
    REM pause
)
goto check_time

:end_reqest
  del "%~dp0lockfile1.lock"

endlocal
~~~


## python_get_time.py [UTF-8] save 別途 python が必要　REM可
~~~Python python_get_time.py
import time

# 現在の時刻を取得（ミリ秒単位） 
current_time = time.time() 
formatted_time = time.strftime("%H:%M:%S", time.localtime(current_time)) 
milliseconds = int((current_time - int(current_time)) * 1000) 

# デバッグ用の出力 
print(f"現在時刻: {formatted_time}.{milliseconds:03d}")
~~~

## saving.bat [ANSI(Shift-JIS)]save
~~~BAT saving.bat
@echo off
setlocal
REM 処理受付
del "%~dp0lockfile1.lock"
REM アドレスセット「Pcによってuserの部分が変わる場合がある"C:\Users\tatty\OneDrive\デスクトップ\saving.lnk"
REM ユーザー名の取得とデスクトップパスの設定 
set desktop_path=%USERPROFILE%\OneDrive\デスクトップ
REM デスクトップ上にファイルを作成する例 
echo This is bat これは　Auto Save のバッチです。 "%desktop_path%\saving.lnk"
echo 実行させておきたい時は「最小化」して、見えなくして、実行させておいてください。閉じると停止のまま止まります。
if not exist "%desktop_path%\saving.lnk" (
    echo "%desktop_path%\saving.lnk"
    echo あなたは、アイコンを消しましたよね。。。
    pause
    echo 作りますよ。。。
    pause
    copy "%~dp0saving.lnk" "%desktop_path%\saving.lnk"  
    pause  
)
set my_name_is="%desktop_path%\saving.lnk"

REM 引数をチェック 
if "%1" == "-s" (
 REM -sが指定された場合 echo -sオプションが指定されました。
 if not exist "%~dp0lockfile.lock" (
   REM ロックファイルの作成 
   del "%~dp0lockfile.lock"
   
   REM 無いところから始めてやる。
  )
) 

REM 引数をチェック
if "%1" == "-n" (
    REM -nが指定された場合の処理
    echo -nオプションが指定されました。
    if not exist "%~dp0lockfile.lock" (
        REM ロックファイルのコピー
        copy "%~dp0lockfile_m.lock" "%~dp0lockfile.lock"
        REM ショートカットのアイコンを変更
        powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('%my_name_is%'); $s.IconLocation='%~dp0Stop_go_Work.ico'; $s.Save()"
        call timed_saving.bat
       	echo 動作中-n。
        pause

    ) else (
	    del "%~dp0lockfile.lock"
	    powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('%my_name_is%'); $s.IconLocation='%~dp0save_ranning.ico';$s.Save()"
        call timed_saving.bat -s
        echo 待機中-n。
        pause

    )
) else (
    REM 通常の処理
    echo 通常の処理を実行します。
    REM ショートカットのアイコンを変更
    if not exist "%~dp0lockfile.lock" (
        REM ロックファイルのコピー
        copy "%~dp0lockfile_m.lock" "%~dp0lockfile.lock"
        REM ショートカットのアイコンを変更
        powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('%my_name_is%'); $s.IconLocation='%~dp0Stop_go_Work.ico'; $s.Save()"
		echo 動作中。
        call timed_saving_p.bat
　　    
    ) else (
	    del "%~dp0lockfile.lock"
	    powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('%my_name_is%'); $s.IconLocation='%~dp0save_ranning.ico'; $s.Save()"
　　　　　echo 待機中。
        call timed_saving_p.bat -s 　　    
    )
)

REM その他のバッチ処理

endlocal

~~~

## 概略　まず、肝心なところ。
### タイマー編
ロックファイルを消せばプログラム的に終われるようにして、二回目の進入を禁止している。
REM セッティング間隔（秒単位） 
set /a my_kankaku=30 
動いていて30秒で必ず終わりがあるか設定してある。
初期化と30秒を計算に使える様にしている。
初期時間
loop
python の実行
現在の時間を再度取得
1Sec目の最初の1回だけを通す。
予備の同期
REM 足されているime2から0:00:00に一日分引いてしまう。引いた残りの数が必要な数。
現在のタイムスタンプpython
現在のタイムスタンプbat
ロックファイルが無ければbreakする(0)
30Sec経っているか?
処理
loopへ
ロック1を消して、再実行できるように。
終わり。

### Python
フォーマットに従い時間を取得しているだけmSec用

### アイコンの表示状態を見てコントロールを変える
リセット
ロックファイル(0)コピー
-s スイッチの処理後共通のオプション無しをやる。
-n オプションの処理

REM ショートカットのアイコンを変更
タイマー編のコール
停止中アイコンに変える

終わり

謝辞　Copilot AI のアドバイスのもと進めさせて頂きました。
「ありがとうございました。」

![スクリーンショット 2024-12-13 225845.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/8d82c0d0-0e8a-d71c-af3f-37dc1f3c2fd6.png)

![2024-12-13 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/b5440d38-ca33-be55-ca81-fed805ae39e0.png)
こんな感じ

copyright　たっちゃん