0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

「このプロジェクトは自動保存機能を実装するバッチファイルと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 Stop_S_work.png

アイコンにしたいbatを選択して「右クリック・「ショートカットの作成」」で作ってから

スクリーンショット 2024-12-13 214119.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 動作中-npause

    ) 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 待機中-npause

    )
) 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

2024-12-13 (5).png
こんな感じ

copyright たっちゃん

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?