会社でちょっとサボタージュするときに仕事してる感を出したくて作ってみました。
コマンドライン上で以下のように動きます。
www.youtube.com
コード全体
とりあえず以下が今回作ったコードの全体像です。@echo off echo -------------------------------------------------------- echo Run Start: %date% %time% echo; rem 遅延環境変数の展開をOKにするおまじない SETLOCAL ENABLEDELAYEDEXPANSION rem 変数初期化 set RNG=0 set wt=0 for /l %%c in (1, 1, 10) do ( if %%c neq 1 ( set /p prefix="Next process...["< nul ) else ( set /p prefix="Process start...["< nul ) for /l %%n in (1, 1, 30) do ( set /p p_var="#"< nul rem 3桁の乱数作成 set /a RNG=!RANDOM! %% 1000 rem 生成した乱数が900以上なら if !RNG! geq 900 ( set /a wt=!RANDOM! %% 10 timeout /t !wt! > nul ) else ( timeout /t 0 > nul ) ) set /p suffix="]"< nul echo; echo; ) echo; echo The program finished successfully. echo End Time: %date% %time% echo --------------------------------------------------------
@echo off について
@echo off echo -------------------------------------------------------- echo Run Start: %date% %time% echo;
まず、冒頭の@echo off
は、コマンドラインを見やすくするためのコマンドです。
これを書くことでecho
毎の冗長出力を阻止しています。
詳細は以下のサイトを確認ください。
バッチファイルによく出てくる@echo offの意味 #Windows - Qiita
遅延環境変数の展開について
rem 遅延環境変数の展開をOKにするおまじない SETLOCAL ENABLEDELAYEDEXPANSION
SETLOCAL ENABLEDELAYEDEXPANSION
は、遅延環境変数展開のためのおまじないです。
遅延環境変数展開って字面が難しそうに見えますね。
雑にいうと、batファイルはコードの読み込み時に変数の中身を固定してしまうので、読み込んだ後の値の更新も展開してくれってこの部分でお願いしてます。
以下のサイトがすごくわかりやすいです。
遅延環境変数とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
使用変数の解説
本コードでは5つの変数をはじめに初期化してます。それぞれ役割をメモ程度に書いときます。
rem 変数初期化 set RNG=0 生成した三桁の乱数を保持する set wt=0 待ち時間を保持する
メイン処理
このbatファイルのメイン部分は以下の繰り返し処理です。for /l %%c in (1, 1, 10) do ( if %%c neq 1 ( set /p prefix="Next process...["< nul ) else ( set /p prefix="Process start...["< nul ) for /l %%n in (1, 1, 30) do ( set /p p_var="#"< nul rem 3桁の乱数作成 set /a RNG=!RANDOM! %% 1000 rem 生成した乱数が900以上なら if !RNG! geq 900 ( set /a wt=!RANDOM! %% 10 timeout /t !wt! > nul ) else ( timeout /t 0 > nul ) ) set /p suffix="]"< nul echo; echo; )
改行なしで出力するためにset /p
を使う
batファイルはecho
で出力する毎に改行が入ってしまうので、プログレスバーを再現するためにset /p
を使ってます。set /p
のように/p
オプションを使うことで、ユーザの入力を促すことができます。本来は
prefix
という変数に代入する値をユーザに入力させる効果があるのですが、set /p 変数名="値"< nul
とすることで値を代入&改行なしで出力しています。待機時間の生成
以下の処理では、PCに何かしら処理をさせている感を出すために乱数を生成して、次の「#」出力までの待機時間を演出しています。rem 3桁の乱数作成 set /a RNG=!RANDOM! %% 1000 rem 生成した乱数が900以上なら if !RNG! geq 900 ( set /a wt=!RANDOM! %% 10 timeout /t !wt! > nul ) else ( timeout /t 0 > nul )
batファイルでは「ミリ秒待機」が使えない
なんで乱数の生成をこんなにもややこしくしてるか、ちゃんとこだわりあります。まず、batファイルでは
timeout /t 待機時間(秒)> nul
でプログラムの実行を待機させることができます。しかしミリ秒が扱えないようです。ミリ秒が扱えないということは、例えば「待機時間を毎回0~9の中から無作為に選ぶ」としたとき、プログレスバー(もどき)の進行は0を引かない限り毎度毎度止まります。
通常待機0秒で進行し、たまに数秒待たされるプログレスバーを再現するために試行錯誤した結果がこのbatファイルです。
※rem powershell -Command "sleep -m !wt!"
ように、powershell側でミリ秒 sleep(待機)させるのもアリ。
乱数生成
上記理由があるため、0~999までの範囲で乱数を生成して、その乱数が900より大きい場合は1~9秒待機という方法を取っています。こうすることで10回に1回程度、プログレスバーの進行を待機させています。set /a
の/a
は、set /a 変数名=計算式
のように右辺計算式
の結果を変数名
に代入させるオプションです。
rem 3桁の乱数作成 set /a RNG=!RANDOM! %% 1000
RANDOM
で0~32,767(15bit?)までの乱数を生成できます。
普通batファイルで変数を扱うときは%RANDOM%
のように「%」で変数名を囲うのですが、「!」で囲っているのは上述した遅延環境変数展開のためです。
また!RANDOM! %% 1000
のように、生成した乱数を1,000で割ったときの余りを出してます。こうすることで0~999までの乱数に整えています。
※batでは%%
で余剰をだせる。
ループ処理について
このbatファイルでは繰り返し処理(for文)を入れ子にしています。for /l %%c in (1, 1, 10) do ( 外側処理 for /l %%n in (1, 1, 30) do ( 内側処理 ) )
構造としては以下のようになっています。
「#」出力を30回実行したら次のプログレスバー出力に移行し、これを10回ループしています。
batファイル結構楽しい
こんな感じでbatファイル作っといて、コーヒー買いに行くときとかに実行しとけば「PCに仕事させてて終わるの待ってんのかな」って上司に思わせることができそうです。batファイルで遊ぶの、結構楽しくてハマりそう。
ブラウザ上でも動くようにJavascriptでも作ってみました。
デスクトップなら綺麗に動くはず。(スマホだと描画位置がズレます)
https://castoroides.github.io/others/MimicryWorker.html
以下、実行画面。
www.youtube.com