エラーはbatファイルに限らず、エラーの位置より前が怪しい。
例えば、「??が不正です」とあれば??より前の処理でエラーが発生している。
ソリッドワークス/SolidWorks、AP100、プログラム、TIG,CO2,手棒、板金
直近の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 秒待っています。続行するには何かキーを押してください …
文字列の比較は==が使える。
と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を強制シャットダウン。
ウィンドウを持つアプリってマウス操作で実行。
って思い込んでないすか?。コマンドで実行できればタスクスケジューラに登録。自動化できる。
以下をコマンドプロンプトに入力
putty -load myhome
でも
putty -load myHome
でもどちらも動いた。Hの大文字小文字は関係ないようだ。
上図に見えるmyhomeはレジストリに登録されているらしくファイルでは存在しない。
putty.exeにpathが通ってないと以下のメッセージになる。
‘putty’ は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
昔、MS-DOSのころは確かこれだったですね。
コマンドまたはファイル名が違います。
さて、
Progam Files¥puttyフォルダに移動したらファイル名を見つけることができるので確実に実行できる。
なお、
Puttyを実行するとコマンドプロンプトが開くが、閉じるボタンを押すと毎回以下のウィンドウがでる。
この確認を省略する。以下のチェックを2つ外す。
こちらのサイトが詳しいです。
変数って環境変数のことです。環境変数とは文字列。グローバルとは他のプロセスに引き継ぐことができるという意味です。引き継ぐとはプロセスを起動した時点の環境変数の値がコピーされるという意味で、起動後に環境変数を変えてプロセス間でデータの共有をすることはできない。
グローバル、変数と書いたのがややこしいんだろう。
cmd.exe実行中、つまりコマンドプロンプトで、その中でcmdを実行することで環境変数が引き継がれる(グローバル?)ことがわかる。
cmd.exeはコマンドプロンプトのウィンドを共有しますが、ここからnotepad.exeを実行するとメモ帳のウィンドが起動する。notepad.exeでも環境変数aが使える。ただ、notepad.exeは他人が作ったアプリなのでその変数を取り込んで何かすることはできないし、示せないので。
簡易的に別のプロセスが動いているように見えるようにcmdを実行してみます。コマンドプロンプトを共有しないようにstartコマンドを使う。