使用延迟扩展限制拆分字符串

时间:2012-11-23 12:27:17

标签: batch-file

当我测试脚本时,我尝试使用批处理从字符串中提取字符时遇到此问题。我把它简化成一个简单的例子。 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

2 个答案:

答案 0 :(得分:3)

只需将变量ab转移到FOR变量。

@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

答案 1 :(得分: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%!
)