スクリプトをテストしているときに、バッチを使用して文字列から文字を抽出しようとしたときに、この問題に遭遇しました。簡単な例に簡略化しました。t.txt
単語が含まれているだけhello
です。
@echo off
setlocal enabledelayedexpansion
set a=0
set b=1
for /f %%a in (t.txt) do (
set x=%%a
echo !x:~!a!,!b!!
set /a x+=1
)
pause >nul
問題は、遅延展開を使用して変数にアクセスする必要があることです。ループの値をx
更新しているため、遅延展開を使用してこれらにもアクセスする必要があります。a
b
変数を使用して文字列を分割しようとするとa
、b
すべて遅延展開が必要になりますが、!
マークの順序は、意図したとおりに解析されないことを意味します。
CMDは、最初に内側のコマンドを展開する代わりに、コマンドを!x:~!
、、!,!
およびとして展開します。!!
もちろん、私も使用できません%
。
これを回避するために私が見つけた唯一の方法は、ループ内にない外部関数を呼び出すことです。これにより、を使用できます%
。
@echo off
setlocal enabledelayedexpansion
set a=0
set b=1
set v=
for /f %%a in (t.txt) do (
set x=%%a
call :RETURN x
set /a x+=1
)
pause >nul
:RETURN
set v=%1
echo %v:~!a!,!b!%
cmdにコマンドを必要な方法で解析させる方法はありますか、それともこれは私が使用call
しなければならない制限にすぎませんか?