- 北の空からみなみへ -
exblog staff

<< 砂場遊び /3.4 (ちょこっ... 砂場遊び /2 >>
砂場遊び /3(やっぱワンライナーが好き)
2018年 02月 20日
年末作成のバッチ修正で苦労した。
プログラミング言語が使える人なら苦もない修正だろうが、バッチのみ(せいぜい WSH ≒ VBScript 止まり)で対応させようとすると結構行数が増えていく。

修正箇所はなんのことはない。CHOICEコマンドでの選択枝で分岐する部分。
作ってしまってから気づいたのだが、Windows XPなどには CHOICE.exe が付属していなかった。
そこで、バッチのみで割と汎用的な選択ルーチンを作ろうとして、行数が長いサブルーチンとなってしまった。(詳細は more 欄追記します)
まあなんとからしきものはできたものの、CHOICE.exe では可能なタイムアウトでの自動実行処理がどうしても実装できなかった。
そこでいっそのこと、正月にコメント欄で頂戴した助言に従って、VBScript のワンライナーをバッチから吐き出す形にしてみた。そしてこの件は解決をみた。

そうそう。その過程で気付いたことをひとつ。(結構、重要)
バッチのラベルって8文字までだと思い込んでいたしネットにもそのような上級者からの助言があったのだが、バッチの砂場で検証したらそうではないらしい。(少なくとも XP以降は大丈夫)
つまり、[:TST$parameters.test] などという長かったり拡張子あったりでもきちんと区別して動くようだ。
(ついでだが、ラベル直後に &~~~ とコメントも入れておける。これは exit/b &~~ や goto ~&~~ と同じだった)

さて、タイムアウト付きポップアップのサブルーチンはこんな感じ。
:TST$popup はワンライナーを吐き出す(表示する)サブルーチンを呼びだして、.vbsファイルに吐き出させてそれを実行する。(実行前後の時刻表示 、実行後エラーレベル表示 、 終了コードをvbsからの引き継ぎ値にしている)

:DSP$popup は VBScript が コロン[:]で区切ることが可能だそうなので、それを利用したワンライナー

横長表示が嫌いな方には申し訳ございません...
:TST$popup
echo off&call :DSP$popup %1 %2 %3 %4 >$msgbox.vbs&type $msgbox.vbs
echo.%time%&cscript //nologo $msgbox.vbs
echo %time%&echo.errolevel=%errorlevel%&del $msgbox.vbs&exit/b %errorlevel%

:DSP$popup&title / message / vbYesNo+vbQuestion+vbDefaultButton2 / 秒数
echo Dim intRet:Set objShell=CreateObject("Wscript.Shell"):intRet=objShell.Popup("%~2",%4,"%~1",%3):Wscript.Quit(intRet)
exit/b

このサブルーチンを直接呼び出すための仕掛けは 温故か懐古か発掘か /3 で書いた冒頭2行です。(mvandlog.bat の冒頭)

次のコマンド入力で実行してみます。
mvandlog !/! TST$popup メッセージ実験 "リターンを二番目のボタンに設定"+vbCRLF+" OK:ハイ の戻り値=6"+vbCRLF+" NO:いいえ 戻り値=7"+vbCRLF+" タイムアウトでは時間切れ=-1" vbQuestion+vbYesNo+vbDefaultButton2 09

実行してみてポップアップ表示中の結果はこちら。(文字サイズ大きめだったため画像サイズがブログ表示にフィットできず見にくくて申し訳ない)
c0062295_20145216.gif


イエスを選んでバッチから戻った直後に次のコマンドでエラーレベル確認した。
if not errorlevel 0 (echo.時間切れでした) else if errorlevel 7 (echo.いいえを押しました) else echo.はいを押して errorlevel=%errorlevel% でした
c0062295_20183999.gif
無事に砂場のテストは完了できた。



バッチのみで作ってみたのはこちらです。
サブルーチンを次のように呼び出します。

call :choice YNC "いずれかの文字を入力してください. "
:choice&rem %1=選択肢文字列(6文字まで) %2=メッセージタイトル
set key=%~1&set $sel=0
set $key=%key:~0,1% %key:~1,1% %key:~2,1% %key:~3,1% %key:~4,1% %key:~5,1%
set $key=%$key: = %
set $key=%$key: = %&rem 連続空白を単個空白へ(上は3→1個)
set $key=%$key:~0,-1%
set $key=%$key: =,%
set/p sel=%~2 [%$key%]?&set $key=
set sel=%sel:~0,1%
setlocal enabledelayedexpansion
for %%c in ( %key:~0,1% %key:~1,1% %key:~2,1% %key:~3,1% %key:~4,1% %key:~5,1%) do set/a $sel+=1&if /i %%~c == !sel! set $sel=!$sel!&goto choicend
endlocal&goto choice
:choicend
endlocal&exit/b %$sel%
timeoutが不要で、外部ポップアップを嫌う場面では、これも使えるかもしれませんね。

[PR]
by bucmacoto | 2018-02-20 21:22 | &Tips;&code; | Trackback(7) | Comments(0)
トラックバックURL : https://bucmac.exblog.jp/tb/29325163
トラックバックする(会員専用) [ヘルプ]
Tracked from cremas caser.. at 2018-07-07 00:04
タイトル : Mira a estos chicos
砂場遊び /3(やっぱワンライナーが好き) : 北の夢想科学小説... more
Tracked from terrores noc.. at 2018-07-07 03:38
タイトル : ven aqui
砂場遊び /3(やっぱワンライナーが好き) : 北の夢想科学小説... more
Tracked from mejor crema .. at 2018-07-07 03:38
タイトル : Haga clic para obtener más i..
砂場遊び /3(やっぱワンライナーが好き) : 北の夢想科学小説... more
Tracked from amazon fire .. at 2018-07-23 12:39
タイトル : amazon fire phone
砂場遊び /3(やっぱワンライナーが好き) : 北の夢想科学小説... more
Tracked from amazon fire .. at 2018-07-23 15:36
タイトル : amazon fire phone
砂場遊び /3(やっぱワンライナーが好き) : 北の夢想科学小説... more
Tracked from amazon fire .. at 2018-07-26 12:27
タイトル : amazon fire phone lock scree..
砂場遊び /3(やっぱワンライナーが好き) : 北の夢想科学小説... more
Tracked from amazon fire .. at 2018-07-26 16:51
タイトル : amazon fire phone nfc
砂場遊び /3(やっぱワンライナーが好き) : 北の夢想科学小説... more
名前
URL
画像認証
削除用パスワード
<< 砂場遊び /3.4 (ちょこっ... 砂場遊び /2 >>
<< 砂場遊び /3.4 (ちょこっ... 砂場遊び /2 >>