2

スクリプトをテストしているときに、バッチを使用して文字列から文字を抽出しようとしたときに、この問題に遭遇しました。簡単な例に簡略化しました。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更新しているため、遅延展開を使用してこれらにもアクセスする必要があります。ab

変数を使用して文字列を分割しようとするとabすべて遅延展開が必要になりますが、!マークの順序は、意図したとおりに解析されないことを意味します。

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しなければならない制限にすぎませんか?

4

2 に答える 2

3

a変数とbFOR変数を転送するだけです。

@echo off
setlocal enabledelayedexpansion
set a=0
set b=1
for /f %%a in (t.txt) do (
  set "x=%%a"
  for /f "tokens=1,2" %%A in ("%a% %b%") do echo !x:~%%A,%%B!
  REM this line makes no sense if x=hello: set /a x+=1
)
pause >nul
于 2012-11-23T13:53:06.490 に答える
3

遅延拡張と通常拡張の混合は機能します。

@echo off
setlocal EnableDelayedExpansion
set a=0
set b=1
for /f %%L in (t.txt) do (
  set "x=%%L"
  echo !x:~%A%,%B%!
)
于 2012-11-23T13:56:22.577 に答える