13
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

湯婆婆Advent Calendar 2020

Day 8

湯婆婆.bat

Last updated at Posted at 2020-11-18

はじめに

はい、すでに出落ち感あるんですけど流行に乗りたかったので他にやってる人があまりいなくてパッと作れそうな奴で作ってみました
湯婆婆です
元ネタ→ Javaで湯婆婆を実装してみる
以下簡単な仕様

  • 名前を入力させる
  • 名前を読み取る
  • 0 <= n < 名前.Length の乱数を生成する
  • 生成した乱数をインデックスとして使用し、名前から一文字抽出
  • 抽出した文字を新たな名前として与える
  • 働かせる

コード

(encodeはshift-jisです。実行できないなどの場合はencodeがutf-8などshift-jis以外になっていないか確認してください)

Yubaba.bat
@echo off
setlocal enabledelayedexpansion
cd %~dp0
echo "契約書だよ。そこに名前を書きな。"
SET /P name=
set cname=%name%
set /a len = 0
:LOOP
if not "%cname%"=="" (
     set cname=%cname:~1%
     set /a len=%len%+1
     goto :LOOP
)
echo "フン。%name%というのかい。贅沢な名だねぇ。"
set /a sindex=%random%%%len
call set newName=%%name:~%sindex%,1%%
echo "今からお前の名前は%newName%だ。いいかい、%newName%だよ。分かったら返事をするんだ、%newName%^!^!"
pause 

image.png

解説

まあ解説するような部分も無いですが一応、まずは頭の3行、

@echo off
setlocal enabledelayedexpansion
cd %~dp0

これは知ってる人多いというか常識ですが、デフォルトの状態では何か実行する度に発行されたscryptがコマンドラインに吐き出されるんですね。それを@echo offと記述することでechoを無効化しています
そして2行目のsetlocal enabledelayedexpansion 。これを利用することで変数を読み込むタイミングを遅らせることができます。詳しくはググってください。
そして3行目のcd %~dp0はカレントディレクトリを現在実行しているバッチファイルのディレクトリへ移動してくれます。
この3つはバッチファイルを記述する上でお約束みたいなもんですね。
では実際に処理を行っている部分の解説へ入っていきます。

echo "契約書だよ。そこに名前を書きな。"
SET /P name=
set cname=%name%
set /a len = 0
:LOOP
if not "%cname%"=="" (
     set cname=%cname:~1%
     set /a len=%len%+1
     goto :LOOP
)
echo "フン。%name%というのかい。贅沢な名だねぇ。"
set /a sindex=%random%%%len
call set newName=%%name:~%sindex%,1%%
echo "今からお前の名前は%newName%だ。いいかい、%newName%だよ。分かったら返事をするんだ、%newName%^!^!"
pause 

ではまずは原作通り契約書を渡して名前を書いてもらいましょう

echo "契約書だよ。そこに名前を書きな。"
SET /P name=

ここではSET /P name=でコマンドラインに入力された文字列をnameという変数に入れています。
そして入力された名前の桁数を数えましょう。これは乱数の上限値に使います。4文字の名前から5番目の文字を抽出するなんてことにならないように。

:LOOP
if not "%cname%"=="" (
     set cname=%cname:~1%
     set /a len=%len%+1
     goto :LOOP
)

この処理はIT初心者がお世話になるササキマコトさんのサイトにあった処理をまるまるパクらせていただきました。↓
Windowsバッチファイル(.bat)、文字数を取得する
処理の流れとしては文字列を1文字ずつ削って空文字になるまでの回数をカウントするというシンプルな処理です。
では取得できた文字数を上限とする乱数を生成しましょう

set /a sindex=%random%%%len

乱数の生成には%random%を使用しました
%random%で生成した値を先ほど取得した桁数で割ってあまりを求めます
あまりを求める計算は数値%%数値のように%二つでできます

そして生成した乱数をインデックスとして使用し、コマンドラインに入力させた名前から1文字抽出します

call set newName=%%name:~%sindex%,1%%

文字列の抽出は↓を参考にしました
Windowsバッチ(.bat)で文字列の切り出しを行う(Substrみたいな)
m文字目から、n文字分というように文字列を抽出する場合は

%STR:~m,n%

という風に記述するようです。わかりにくい。
ちなみに変数を利用する場合はsetの前にcallを記述する必要があります。

ということで無事名前も奪えたので後は新しい名前を言い渡して働かせるだけです

echo "今からお前の名前は%newName%だ。いいかい、%newName%だよ。分かったら返事をするんだ、%newName%^!^!"

!などの文字は^でエスケープする必要があります。それ以外は特になんかやってるわけではない普通のechoですね。
以上がバッチファイルで動く湯婆婆です。
解説することないと言いながら結構解説長くなってしまいましたね。
忘れていましたが、もちろん名前を空文字にすると落ちます。仕様なので。
image (1).png

最後に

ここまで読んでくださってありがとうございました。
初投稿でしたが、今後もいろいろ書いていこうと思います。

13
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?