パソコンを起動したら特定のメモ帳を開く。うっかり予防。

月曜にしないといけない事を忘れていることないですか?

あるタイミングでメールとか何かをするって、忘れやすい。朝一でパソコンを起動するとメモ帳が開くってどうですか?

会社のパソコンでもプログラム可能なbat/バッチファイルで作った。

実行の様子です。30秒。

ディスクトップにalertフォルダを作り。この中に1204.txtとか入れておくと、12/4にログインした時に1204.txtをメモ帳で開きます。1月1日は、0101.txtとします。常に月2文字、日付2文字です。

テキストファイルの中に提出物をどこにしまったか。来週金曜提出とか月末期限の仕事、注意点などを書いておきます。

さて、まず。このテキストファイルを作る時に拡張子が見えた方がいい。

拡張子の表示をするようにします。エクスプローラーの表示タブで下図。

ログイン時に実行するbatファイル。名前はmemo.batとでもしておきます。

%homeDrive%
cd %userProfile%
rem 置換 %文字列:m=n%   mをnに置換
set ff=%date:/=%
rem 文字列の取り出し  %文字列:~m,n%   m文字目から文字数n個取り出す
set ff=%ff:~4,30%
set ff=desktop\alert\%ff%.txt
@echo %ff%
if exist %ff% start %ff%

エクスプローラーを起動して、ファイルを指定するテキストボックスにshell:startupと入れて実行します。

するとスタートアップのフォルダが開きます。ここに、ログイン時に実行したいアプリのショートカットやbatファイル(memo.bat)を置く。

作業手順です。3分

以下は、batファイルの説明です。

%homeDrive%はドライブの移動です。大抵はC:ですのでC:を実行するだけでCドライブに操作を変更できる。

%%を囲んで変数(環境変数)で、homeDriveはHomeDriveでも大文字小文字区別はしないようです。ただ、読みやすいように単語の区切りで大文字を使ってるみたい。

Cドライブに移動を確認するために先にd:ドライブに移動してから%homeDrive%を実行します。

cd %userProfile%は、ホームディレクトリ/フォルダに移動します。Windowsの場合は通常、C:\Usersの中にユーザー名でフォルダがあります。ログインユーザー名がusrならcd C:\Users\usrを実行します。

set ff=%date:/=%は、まずdateコマンドを実行してみて下さい。

コマンドだと日付を変更できるので(実際はネットで管理しているのでまた代わります。)入力を求めらるし、「現在の日付・・・」と日本語も入りますが、%date:/=%は、%2024/01/17:/=%となって/は空白文字に置換されて20240117になる。

んん。

bat 文字列 取り出し」で検索してみて下さい。もっといい説明があるかもしれません。

set ff=%ff:~4,30%

環境変数ffの文字列の4文字より後の文字列、30文字まで取り出すい。正確には4文字ですが、オーバーしても問題なく取り出せます。

で、ff環境変数に月2桁と日付2桁が入っていれば、

C:\Users\usrの中にDesktopがありますので、

C:\Users\usr>start Desktop\alert\0118.txt

を実行すればデスクトップ上にalertフォルダがあり、その中に0118.txtがあればメモ帳が起動します。startコマンドは拡張子判断でアプリが起動します。ここではtxtなのでメモ帳を開きます。

ファイルが存在する場合だけstartコマンドを実行する場合はif existを使う。

if exist c:\Users\usr\Desktop\alert\%ff%.txt start 実行したいファイル名

batファイルの例では、何度もDeskt…..と書くのが面倒なのでff変数に入れてます。@echoは確認のために表示します。一瞬なので、確認したい場合は@echoの行の後にpauseを入れて下さい。

set ff=desktop\alert\%ff%.txt
@echo %ff%
pause
if exist %ff% start %ff%

%ff%.txtはdesktop\alert\0118.txtだとした場合、Users\usrフォルダの位置から見てDesktop\alertフォルダ内の0118.txtとなります。

スクリーンセーバーになった瞬間に実行

スクリーンセーバーになったということは、

何もしない状態、アイドル状態。

もしかして、人が座っていない可能性もある。

そんな状況、アイドル状態をチェック、監視して実行するって、プログラムでアイドル状態を監視は難しい?

代わりにスクリーンセーバーの起動の設定。と、タスクスケジューラのトリガー設定。

タスクスケジューラのトリガーの設定で、タスクの開始を「ワークステーション ロック時」にする。

スクリーンセーバー中にtaskkillを実行

タスクスケジューラでの設定に注意google

スクリーンセーバーを有効にすると何もしない状態、アイドル状態のチェックが以下のVBSでできる。特に、スクリーンセーバー中に実行したい場合は以下のVBSが使えます。こちらからいただきました。m(_ _)m

strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery ("SELECT * FROM Win32_Process WHERE Name LIKE '%.scr'")

Set WshShell = WScript.CreateObject("WScript.Shell")
If colProcesses.Count = 0 Then
    '    Wscript.Echo "No Screensaver Event"
Else
   'スクリーンセーバー中は以下を実行する
   WshShell.Run "taskkill /im putty.exe /f",0,True
End If

このVBSをタスクスケジューラで5分ごとに起動します。スクリーンセーバー中で無いと、つまり、使っている時は、何もしません。(コメントアウトWscript.Echo “No Screensaver Event”)。

タスクスケジューラのプログラムの開始のコマンドは、vbsなんでフルパスで指定する。コマンドプロンプトで以下のを実行し、VBS拡張子が登録されていないとファイル名だけでは実行できない。

C:\Users\take>set | findstr EXE
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

5,15,25,35,45,55分に実行するbatバッチ

直近の5が付く分までの秒数を計算できれば、timeoutコマンドで秒数を指定して待つことができる。

コマンドプロンプト、batファイルでの計算は、set /a 変数=オペランドと演算子とオペランド。

C:\Users\take>set /a x=3*2
6
C:\Users\take>set /a x=3/2
1

ここでは、演算子は*と/。

コマンドから一部をとり出すこともできる。とりあえず、timeコマンド。時間を表示し変更もできる。

C:\Users\take>time
現在の時刻: 12:19:05.42
新しい時刻を入力してください:

今の時間はecho %time%で表示できる。cmd.exeが持っているtimeはコマンドです。

C:\Users\take>echo %time%
22:19:18.21

分の部分を取り出す。set /a mm=%time:~3,2%。左から3文字目から2文字取り出す。

C:\Users\take>echo %time%
22:21:41.78
C:\Users\take>set /a mm=%time:~3,2%
21

秒を取り出す。set /a ss=%time:~6,2%

C:\Users\take>set /a ss=%time:~6,2%
56

直近の5,15,25,35,45,55を探す前に、剰余計算。

分を10で割って余りをxに入れる。%%は剰余計算の演算子。

set /a x=mm%%10

%%の剰余計算はコマンドプロンプトではできない。

C:\Users\take>set /a mm=%time:~3,2%
28
C:\Users\take>set /a x=mm%%10
オペランドがありません。

となるの。mmや10のオペランドはあるのにね。で、a.batファイルを作って実行する。

C:\Users\take>type a.bat
set /a mm=%time:~3,2%
echo %mm%
set /a x=mm%%10
echo %x%
C:\Users\take>a
C:\Users\take>set /a mm=32
C:\Users\take>echo 32
32
C:\Users\take>set /a x=mm%10
C:\Users\take>echo 2
2

xが5より小さい場合は、(4-x)*60+(60-ss)

xが5以上の場合は、(14-x)*60+(60-ss)

4と14は、秒の分を足すため。5や15ではない。

ifって面倒?でset /a は、(4-x)*60+(60-ss)のように複数のオペランドの計算ができないようなので。よって以下のように分解するか、別のbatファイルにする。これ素直にハマりますので分解かbatにします。

set /a aa=4-x
set /a aa=aa*60
set /a aa=aa+60
set /a aa=aa-ss

別のbatファイル。ok.bat。batバッチファイルにすると問題無く動く。

set /a aa=(4-x)*60+(60-ss)

以下、完成品。分解の方を使う。

set /a mm=%time:~3,2%
set /a ss=%time:~6,2%
echo %mm%:%ss%
set /a x=mm%%10
echo %x%
if %x% lss 5 (
set /a aa=4-x
set /a aa=aa*60
set /a aa=aa+60
set /a aa=aa-ss
) else (
set /a aa=14-x
set /a aa=aa*60
set /a aa=aa+60
set /a aa=aa-ss
)
echo %aa%

これを5.batとすると、以下のように使える。コマンドプロンプト上の変数はグローバル変数と考えていいです。callでbatファイルを実行して、そこの変数はそのコマンドプロンプトで使える。コマンドプロンプトを閉じるまで。

aa変数は5.batで使っている。callしたbatバッチファイル内の変数aaだけ使っている。

@echo off
call 5.bat
rem 10秒短くする
set /a aa=aa-10
timeout /t %aa%
echo 何か実行

5.batを何分何十秒待つのか表示するように変更。

@echo off
set /a mm=%time:~3,2%
set /a ss=%time:~6,2%
echo ??:%mm%:%ss%
set /a x=mm%%10
echo 比較する値 %x%

if %x% lss 5 (
set /a m=4-x
set /a aa=m*60
set /a aa=aa+60
set /a aa=aa-ss
) else (
set /a m=14-x
set /a aa=m*60
set /a aa=aa+60
set /a aa=aa-ss
)
set /a s=60-ss
echo 答えaaは%aa%
echo %m%分%s%秒後

実行のようす。

C:\Users\take>5
??:43:59
比較する値 3
答えaaは61
1分1秒後

引数を入れて、何秒か待つ処理を追加。

if “%1″==””の分岐を追加する。””と比較するので%1の第2引数が無いとif “”=””となって式が成立する。if %1==””だとif ==””となりエラーなる。

@echo off
if "%1"=="" (
@echo off
call 5.bat
rem 10秒短くする
set /a aa=aa-10
timeout /t %aa%
echo 何か実行
) else (
	timeout /t %1
)

引数あり。

C:\Users\take>a 2
2 秒待っています。続行するには何かキーを押してください …

引数なし。

C:\Users\take>a
??:29:4
比較する値 9
答えaaは356
5分56秒後
370 秒待っています。続行するには何かキーを押してください …

batバッチでIf文

文字列の比較は==が使える。

とif文が普通のプログラムを書くのと違って、コマンドなんです!。空白やカッコも使えるんだ。以下はコマンドプロンプト。

(c) 2019 Microsoft Corporation. All rights reserved.
C:\Users\take>
C:\Users\take>set aa=kk
C:\Users\take>if %aa%==kk echo yes
yes
C:\Users\take>if %aa%==jj echo yes
C:\Users\take>if %aa%==jj echo yes else echo no
C:\Users\take>if %aa%==kk echo yes
yes
C:\Users\take>if %aa%==kk echo yes else echo no
yes else echo no
C:\Users\take>if %aa%==kk (echo yes) else (echo no)
yes
C:\Users\take>if %aa%==kssk (echo yes) else (echo no)
no

数値の比較は、=とか<とか<が使えない。

equは、等しい。

equalイコールだろうね。==は文字列として使えるからいいか。

neqは、等しくない。equalはeqとして使うことを覚えるしかないか。

not equalノットで否定だな。VBAのように<>が使えればいいのに。

gtrは、より大きい。>が使えれば。gtrは目立つアルファベット

greaterのgとtとrか。<が使えればいいのに。

geqは、以上。>=が使えれば。gとeq

以上とは、もってうえ、以って上。greater equalか。

leqは、以下。<=がつかえれば。lとeq

less equal。lessレス。より小さい。<=が使えればね。

C:\Users\take>if 1 lss 2 (echo yes) else (echo no)
yes

lssは、より小さい。未満。満たない。<が使えればね。lssは目立つアルファベット

まとめると。

=は、equ
<>は、neq
>は、gtr
>=は、geq
<=は、leq
<は、lss

コマンドでプロキシを設定する

IE、インターネットエクスプローラー。もうIEは古いのかわからないが、設定はこれでないと細かくできない?。Windows10では必要無いかな。

プロキシを使う1(チェック、次図)、使わない0設定。ここでは最後の1、使うに設定している。これはレジストリの書き換えになる。

reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyEnable /t reg_dword /d 1

この図の状態。

プロキシサーバー172.16.1.1、ポート番号8080の設定の場合

reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyServer /t reg_sz /d "172.16.1.1:8080"

この状態。

Socketの設定の場合、IPアドレス127.0.0.1、ポート番号10000に設定。

reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyServer /t reg_sz /d "socks=127.0.0.1:10000"

この状態

「次で始まるアドレスにはプロキシを使用しない」の設定。/d “192.168.2.1”

reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyOverride /t reg_sz /d "192.168.2.1"

レジストリの設定ができても、実体のブラウザは更新されない。はず、だったがWindows10では大丈夫みたい。Windows7時代は活を入れるために一度IEをstartコマンドで実行し、timeoutコマンドは10秒待ちで、強制終了taskkillする。/imはイメージファイル=コマンドファイル。/fが強制。

start /d "C:\Program Files\Internet Explorer\" iexplore.exe
timeout /t 10
taskkill /im iexplore.exe /f

IEを起動するのがポイント。timeoutコマンドでIEが起動したころをみはからって、taskkillコマンドでIEを強制シャットダウン。

batバッチの変数もグローバル変数?

こちらのサイトが詳しいです。

変数って環境変数のことです。環境変数とは文字列。グローバルとは他のプロセスに引き継ぐことができるという意味です。引き継ぐとはプロセスを起動した時点の環境変数の値がコピーされるという意味で、起動後に環境変数を変えてプロセス間でデータの共有をすることはできない。

グローバル、変数と書いたのがややこしいんだろう。

cmd.exe実行中、つまりコマンドプロンプトで、その中でcmdを実行することで環境変数が引き継がれる(グローバル?)ことがわかる。

cmd.exeはコマンドプロンプトのウィンドを共有しますが、ここからnotepad.exeを実行するとメモ帳のウィンドが起動する。notepad.exeでも環境変数aが使える。ただ、notepad.exeは他人が作ったアプリなのでその変数を取り込んで何かすることはできないし、示せないので。

簡易的に別のプロセスが動いているように見えるようにcmdを実行してみます。コマンドプロンプトを共有しないようにstartコマンドを使う。