1
1

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 1 year has passed since last update.

バッチの変数トリミングサンプル

Last updated at Posted at 2023-04-13

こんなニーズあるかわかりませんが、バッチの変数の最初のスペースを取り去るサンプルです。

変数の中のスペースをすべて削除したい場合は、文字置換で
set data=%data: =%
とすれば簡単にできます。

ところが、「最初のスペースだけを取りたい」という場合はこれは使えないので、作ってみました。
使い道ないかもしれませんが・・・

ちなみに、バッチの変数はグローバル変数が基本です。
でも、出来るだけ、サブルーチンで使う変数はメインルーチンと独立させたいですよね。

一方で、バッチの場合、サブルーチンから数字以外を戻すことが出来ません。

で、今回は、「何文字目から取り出せば頭のスペースを削除できるか?」をリターンすることにしました。
メイン側で、リターンから文字を合成する必要がありますが・・・
なお、このようなケースでは、変数の途中にもスペースが含まれるケースがほとんどなので、””で囲んでおくことを前提としています。

サンプルバッチは以下の通り

今回はたいして説明するところもないので、このサンプルを掲載して終わりです。
サブルーチンから数字を返す場合は、exit /b の後ろに変数を書きます。
コールもとはそれをERRORLEVELとして受け取ることができます。
ERRORLEVELの最大値は、「2147483647」だと思いますので、十分です。

rem メインルーチン
set data="   abcd efg  hi"
echo trim=%data%
call :trim %data%
set trim_start=%ERRORLEVEL%
set data=%data:~0,1%!data:~%trim_start%!
echo trim=%data%

exit /b

rem サブルーチン
:trim
rem 入力:
rem %1 トリミングしたい文字れると含むデータ
rem 途中にスペースを含むため、""で囲んでコールする事。
rem そうしないと、スペースが区切り文字となるので、複数パラメータと認識されてしまう。
rem 出力:
rem スペースを省いた開始位置

set trim_count=1
set trim_data=%1

:trim_next
set trim_head=%trim_data:~1,1%

if "%trim_head%"==" " (
  set /a trim_count+=1
  set trim_data=%trim_data:~0,1%%trim_data:~2%
  goto :trim_next
)
exit /b %trim_count%

ちなみに、グローバル変数でいいじゃん!
という場合はもっともっと、シンプルです。
こちらは、、サブルーチン内で、メイン側の変数そのものを書き換えるので、リターン値は無いです。

rem メインルーチン
set data="   abcd efg  hi"
echo trim=%data%
call :trim
echo trim=%data%

exit /b

rem サブルーチン
:trim
rem 途中のスペースは取らずに、最初のスペースだけ削除する。

set trim_head=%data:~1,1%
if "!trim_head!"==" " (
  set data=%data:~0,1%%data:~2%
  goto :trim
)
exit /b
1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?