🦖
🦕
🦖
🦕
🦖
🦕
🦖
🦕
🦖
🦕

【Windows】仕事してる風に見えるbat処理考えてみた


会社でちょっとサボタージュするときに仕事してる感を出したくて作ってみました。
コマンドライン上で以下のように動きます。

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