おはようございます。くろねこです。
「バッチ特集」の第6回です。
今回の記事は、文字列の長さについてです。
長さを知りたいとき【講釈】
文字列の長さを知りたい ということは・・・
実のところ、あまり浮かびませんでした。
(くろねこが組むバッチでは、文字列の長さをほとんど意識せずに組んだものがほとんどです。)
強いて言うなら
引数で指定された文字列の長さをチェックするくらいではないでしょうか?
例えば、「引数1の値は最大80文字まで」という制限を付けたい場合です。
このようなケースは、strlen()のような関数(機能)がバッチにあればよいのですが、残念ながらありません。
では、どうすればよいのでしょうか?
文字列の長さを調べる
以前の記事で紹介した CALL を利用します。
CALL ではバッチ内の一部をサブルーチンのように呼び出すことができることを説明しました。
この機能と文字列操作を組み合わせ、文字列の長さを調べる機能を実装することができます。
ここで、注意ですが
「文字列の長さ」は「文字数」であることです。
それでは、文字数をカウントする部分のサンプルコードです。
(説明をするうえで、strlenサブルーチンと呼びます。)
:strlen set @work=%* set @len=0 :loop if "%@work%"=="" ( exit /b %@len% ) set /a @len+=1 set @work=%@work:~1% goto loop
このサンプルコードは、単体では使えません。
文字数をカウントしたいバッチの末尾に張り付けて使用してください。
<サンプルの説明>
文字数をカウントしたい文字列は引数で、strlenサブルーチンに渡されてきます。
この文字列を1文字ずつ先頭から削っていき、結果を @work に格納します。
その際に @len を+1します。
これを @workが空になるまで繰り返します。
空になったら、@len の値を終了コードとして終了します。
strlenサブルーチンの呼び出し元では、文字数をERRORLEVELで受け取ります。
以下は、簡単なバッチでの使用例です。
@echo off cd /d %~dp0 set @str=abcde あいうえお 12345 echo. echo 文字列 : %@str% call :strlen %@str% echo 文字数 : %ERRORLEVEL% set @str= exit /b :strlen set @work=%* set @len=0 :loop if "%@work%"=="" ( exit /b %@len% ) set /a @len+=1 set @work=%@work:~1% goto loop
このサンプルコードを適当なフォルダに、sample01.bat というファイル名で保存してください。もちろん、文字コードはANSIです。
sample01.batを実行した状態です。
<補足説明>
〇 長さを調べたい文字列に空白を含んでいた場合は、その空白も文字数としてカウントされます。
〇 文字数は半角も全角も関係なくカウントされます。
%* とは
サンプルコードで、サブルーチン部分で "%*" と記述しているところがあります。
この "%*" とは何ぞや? と思った方多いのでは?
%1 や %2 というのは以前の記事の引数のところで説明しました。
今回、登場した "%*" は、簡単に言えば、すべての引数の値 です。
以下のサンプルを見てください。
@echo off cd /d %~dp0% echo. echo 指定された引数です。(引数1~引数9) echo %%1 : %1 echo %%2 : %2 echo %%3 : %3 echo %%4 : %4 echo %%5 : %5 echo %%6 : %6 echo %%7 : %7 echo %%8 : %8 echo %%9 : %9 echo. echo 指定された引数です。(すべての引数) echo %%* : %*
このサンプルコードを適当なフォルダに、sample02.bat というファイル名で保存してください。もちろん、文字コードはANSIです。
コマンドプロンプトを起動し、sample02.bat を保存したフォルダをカレントフォルダにして、以下のコマンドを実行してみてください。
sample02 1 2 3 4 5 6 7 8 9 10 11 12
sample02.bat に12個の引数を指定して実行します。
%1~%9で9個の引数を受け取ることができますが、10個目以降は受け取れません。
しかし、%* で受け取ると指定したすべての引数を受け取ることができます。
今回、strlenサブルーチン で指定される文字列は空白を含む可能性もあります。
文字列に空白が含まれている場合、別の引数と認識されますが、その場合も正しく動作させるために %* で指定された文字列をすべて受け取っています。
おわりに
今回は「小ネタ」というか「小技」というか
発想や視点を変え、小技を駆使してのような、まるでパズルのような感じですよね。
もう死語かもしれませんが、所謂「高級言語」のように豊富な機能が用意されていないバッチなので、ある意味仕方ありません。
今回の記事で紹介した「文字列の長さ(文字数)」については、多くの方がコードを紹介しています。比較してみて使いやすいものを選択していただければ良いと思っています。
それでは、また!
(お詫び)
第5回で一部、お見苦しい記述がありましたこと、お詫びさせていただきます。
該当部分の修正は完了しております。
m(_ _)m
バッチ特集・ソフトウェアに関する他の記事をご覧いただくには下記をクリックしてください。