こんなニーズあるかわかりませんが、バッチの変数の最初のスペースを取り去るサンプルです。
変数の中のスペースをすべて削除したい場合は、文字置換で
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