Y子です。
今回は、文字列の長さを取得する方法を考えます。
考えましたが、どうもスマートな方法がなく、「1文字ずつ削るループを回して、文字列が空になったらループ回数が長さ」という泥臭い方法に落ち着きました。
#概要・用途
引数に与えた文字列の長さを返します。
用途は幅広いと思いますが、たとえば「○桁以上は○○処理」のような判定に使えます。
【確認環境:Windows 10 Home (Bld. 19042.928)】 →パッチ適用しました
#コード
get_strlen.bat
@echo off
rem 引数がない場合は終了する
if "%~1"=="" (echo 引数がありません & pause & exit /b)
rem 変数初期化(長さ)
set length=0
rem 長さ取得サブルーチンを実行
call :get_strlen %~1
echo 文字数:%length%
exit /b
rem ====サブルーチン====
:get_strlen
set str_in=%~1
:label_top
rem 長さ加算
set /a length+=1
rem 1文字減らす
set str_in=%str_in:~1%
rem 文字列がなくなったら終了
if not "%str_in%"=="" (goto :label_top)
exit /b
文字列長を取得する部分はサブルーチンにし、流用しやすくしました。
サブルーチンの中でループを回し、1文字削るごとにカウンタを+1します。
文字列がなくなったらループ終了し、そのときのカウンタの数値が文字列長です。
実行結果
> get_strlen.bat a
文字数:1
> get_strlen.bat 123456
文字数:6
> get_strlen.bat あかさたな
文字数:5
> get_strlen.bat ABCかきく
文字数:6
> get_strlen.bat !"#$
コマンドの構文が誤っています。
数値もアルファベットも日本語もカウントできますが、記号は苦手のようです。
#おわりに
Windowsコマンドには、文字列長を取得するものがないんですね。
PowerShell等の既成の機能を使えば、手間もかからず間違いもないかと思いますが、どうしてもバッチファイルだけでなんとかしなければならない場合のために、なんとかする手段を持っておくのも強みになるかもしれません。
ではまた。