Windows shutdown ある時間を指定

コマンドプロンプトで
C:\Users\username>aa.bat 17 5
と打てば17:05分にシャットダウンするようなバッチファイルを作った。
参照サイトは、3つ。
計算については、
set /a 計算式
説明はここ

文字の切り出しは、ここ。でも、つぎのサイトで解決。

以下をaa.batファイルにコピペする。元はここ

@echo off
set date_tmp=%date:/=%
:dateコマンドの出力をdate_tmpに入れる。C:\>echo %date:20=%で2018/11/16が18/11/16になる。ここでは%date:/=%なので2018/11/16が20181116になる。参考
set time_tmp=%time: =0%
echo date_tmp:%date_tmp%
echo time_tmp:%time_tmp%

 

set yyyy=%date_tmp:~0,4%
set yy=%date_tmp:~2,2%
set mm=%date_tmp:~4,2%
set dd=%date_tmp:~6,2%
set hh=%time_tmp:~0,2%
set mi=%time_tmp:~3,2%
set ss=%time_tmp:~6,2%
set sss=%time_tmp:~9,2%
set datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%%sss%
set /a hh=%1-hh
echo hh:%hh%
set /a hh=hh*60*60
set /a mi=%2-mi
echo mi:%mi%
set /a mi=mi*60
set /a sss=hh+mi
echo %sss%
shutdown /s /f /t %sss%

不要な部分をカットするのと、
07や08と0ゼロから始まる文字列は、8進数と判断する。
0xだと16進数。set /?参照
だから、
先頭に1を付け加えてから100を引いている。
set /a hh=1%hh%-100
(10時以降ならこの計算式はいらない。気づかんかった。)
aa.bat—————————————

@echo off
set date_tmp=%date:/=%
set time_tmp=%time: =0%
echo date_tmp:%date_tmp%
echo time_tmp:%time_tmp%

 

set hh=%time_tmp:~0,2%
set mi=%time_tmp:~3,2%
set /a hh=1%hh%-100
set /a hh=%1-hh
echo hh:%hh%
set /a hh=hh*60*60

 

set /a mi=1%mi%-100
set /a mi=%2-mi
echo mi:%mi%
set /a mi=mi*60

 

set /a sss=hh+mi
echo %sss%
shutdown /s /f /t %sss%
————————————————–
実行前にa.batですぐにシャットダウンをキャンセルできるようにする。
動作確認でいちいちshutdownを入力するのは面倒だから。
a.bat——————————————

shutdown -a
————————————————-
シャットダウンのキャンセルは、aを入れるだけ。

aa.batの実行は、コマンドプロンプトで以下を入力
aa.bat 17 5
17の前後は半角のスペースが入る。
17と5は、17:05という意味だが、引数はスペースを挟む。
引数は2つ受け取るようになっている。
%1と%2
set /a hh=%1-hhで今の時間から何時間後か計算できる。
set /a mi=%2-miで今の時間
引数以外は、変数は%で囲む。
実行すると以下のような感じだ。

C:\Users\watanabe>aa 17 30
date_tmp:20170820
time_tmp:12:43:44.41
hh:5
mi:-13
17220

17:01マイナス今の時間=17220ミリ秒
昼頃実行したら17220ミリ秒後が17:05

なんでタスクスケジューラーを使わんの?
管理者権限でログインできないPCで使いたかったため。
で、
いつも決まった時間の場合は、引数も含めたバッチファイルを作る。
bb.bat———-
aa.bat 17 20
——————
実行は、bbエンター キー。

 

Ctrl+「スペース」キー

SolidWorksのマクロ VBAExcel VBAに使えるメンバー選択メンバー一覧メンバー選択はよく使うが、メンバー一覧が出ない時にも使えるこれ覚えとこそれと、選択のリスト中で目的の文字列を選んだら「スペース」キーで … “Ctrl+「スペース」キー” の続きを読む

SolidWorksのマクロ VBA
Excel VBAに使える
メンバー選択
メンバー一覧
メンバー選択はよく使うが、メンバー一覧が出ない時にも使える
これ覚えとこ
それと、選択のリスト中で目的の文字列を選んだら「スペース」キーで決定。
スペースキーで選択

Dim str As ここに一覧が、そして、strまで選ぶとstringを選択しているので
このタイミングでCtrl+「スペース」
もし、
Dim str As で一覧が出ない。または、消したら、もう一度
Dim str As このあたりで、Ctrl+「スペース」
これね

台風5号 石鎚山のおかげ?

BlogPaint

12時点の警報の状況
その後、
洪水警報が14時ごろに出て岡山も赤くなる。
石鎚山は東西に壁になってます。
ご安全に

平成30年7月16日
岡山市と倉敷市真備町で大きな災害が発生しました。石鎚山は風は防げるが水害までは無理。私自身、岡山は災害が少ないと気楽に思っていた。常に、安全の方に考える思考が必要だと痛感する。
真備町では、全壊の家が2500棟以上、死者が60人以上になっています。亡くなられました方々に謹んでお悔やみを申し上げます。

一斗缶でそそぐ。きれいに移し替えるには

一斗缶油、溶剤など小さな入れ物に移し替える。そそぐ、注ぐ。こんなことありませんか。左は、空気が入ってボッコンボッコンと飛び散る。元そんな時、ロートじゃありません。ロートでも、ボッコンボッコンとなるのは防げない。ロートは、 … “一斗缶でそそぐ。きれいに移し替えるには” の続きを読む

一斗缶
油、溶剤など小さな入れ物に移し替える。そそぐ、注ぐ。
こんなことありませんか。左は、空気が入ってボッコンボッコンと飛び散る。
BfC4bgvCEAAQcIl

そんな時、ロートじゃありません。
ロート
ロートでも、ボッコンボッコンとなるのは防げない。
ロートは、口が小さい時に使うもの。
ロートを使ってもこの考えは必要。
「だれやすい」のと空気が入ってきてボッコンボッコンで飛び散る。
CJy-nEWVEAAiD4w


だから
草刈り機の給油も
新品時は
缶で補給、新品時
減ってきたら
(新品で一杯入ってる時からこうする人が多いわ。空気がボッコンして飛び散るよね。)
缶で補給
最近、塗装せんから一斗缶って使わなくなったな。
写真は草刈り機に混合油を入れる。

ジュール熱 溶接の電流は時間より強烈

Q=RI^2t\,
Qは熱エネルギー
Rは抵抗
Iは電流。2乗!!!
tは時間
熱エネルギーは、抵抗や時間には比例する。電流は2倍以上、2乗に比例する。
ジュール熱は溶接にも当てはまる。
ジュール熱=溶ける量
抵抗=アーク
電流=設定電流
時間=溶接スピード
溶接の溶ける量に影響するのは
電流の2乗に比例する
溶ける量=電流の2乗は以下の式。
y=x^{2}
yが溶ける量。
xが電流。

x 0 1 2 3 4 5 6 7 8 9 10
y 0 1 4 9 16 25 36 49 64 81 100

電流を少し上げると、溶ける量はもっと上がる。
という感じ。
その感じをグラフにする。
グラフ
横が電流
縦が溶ける量
60Aを120Aにする。
2倍だが
溶ける勢いは、4倍。

settimer() killtimer() WindowsAPIである時間にWindowsがVBAの関数(TimerProc)を呼び出す

ExcelのVBAでもWordのVBAでもできます。

以下を標準モジュールに書く。

Option Explicit

#If VBA7 And Win64 Then
'64bit版
   Private Declare PtrSafe Function SetTimer Lib "user32" _
   (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As LongPtr
#Else
 '32bit版
  Private Declare Function SetTimer Lib "user32" _
  (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
#End If
#If VBA7 And Win64 Then
 '64bit版
  Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
 '32bit版
  Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
#End If

'Windowsが呼び出す関数。引数や戻り値は決まっている。TimerProcで検索すると見つかる
Public Sub TimerProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal TimerID As Long, ByVal TickCount As Long)
  Debug.Print hwnd, Msg, TimerID, TickCount
  KillTimer 0, TimerID 'タイマーを止める。Windowsに教える。
'ここにやりたことを書く
End Sub

Sub main()
  SetTimer 0, 0, 1000 * 2, AddressOf TimerProc '1000で1秒。2秒後にTimeProcを呼び出す
End Sub

二秒後にイミディエイトウィンドウに出力する。イミディエイトは下の方の図の下の方。

もし、二秒にしたいならTimeProc関数のKillTimerの行をコメントアウトか削除する。

1列目はウィンドウハンドル、2列目は275はWM_TIMER = &H113 のこと。3列目は、タイマーID。4列目はWindowsの起動からの経過時間(ミリ秒単位)

これやって何がうれしいのかというと、一定時間後に実行する関数が作れる。
呼び出しを実行するのはWindowsのOS。だからVBAのリソースは使わない。Excelのプロセスとは違う。WordとExcelが動いていて、Wordが固まってもExcelまで影響を受けないのと同じ。ただし、WordとExcel間で通信?していると少し違うが、基本的にWordを閉じたらExcelは普通に使える。これはWindowsOSとExcel間でも同じです。ただ、WordとExcelは同等のアプリですが、WindowsとExcelはWindows管理下にある。このイメージ、メモリ空間かな。常にWindowsは動いている。「windows メモり 空間  64」で検索するといろいろ図が見えるが、仮想のメモリ状態、物理的/実際のメモりアドレスはありません。仮想のメモリ上は常にOS(Windows)が常駐してアプリが切り替わる。

で、

一定時間後に実行する関数は、TimerProc関数。
TimerProcの関数名はaaa関数でも何でもいいが、戻り値や引数の数、型は決まっている。

だって、

Windowsが呼び出すのでその決まり引数の数や型、順番も、あとは戻り値の型に従う。WindowsがExcelのプロセスの関数を呼び出す。
TimerProcの関数名をSettimerの第四引数に指定。
関数名を渡すのではなく、関数があるアドレスを渡すためAddressOf演算子を使う(メモリ上のアドレス/番地を渡すので関数名は関係ない。だからaaa関数でもいい)。

ExcelWordのApplication.OnTimeと同等のことができる。こっちは時間の間隔では無く実行する時間を指定する。5秒後にするには「今の時間+5分」。VBAのコードならNow() + TimeValue(“0:0:5”)。