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,并且因为我正在通过循环更新这些值,a所以b也需要使用延迟扩展来访问这些值。

尝试使用变量ab拆分字符串时,它们都需要延迟扩展,但是!标记的顺序意味着它没有按照我的意图进行解析!

CMD 会将我的命令扩展为!x:~!,!,!!!,而不是先扩展内部命令。显然我也不能使用%'s 。

我发现解决这个问题的唯一方法是调用不在循环中的外部函数,所以我可以使用%'s.

@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

混合延迟和正常扩展将起作用。

@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 回答
3

只需将变量转移abFOR 变量即可。

@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 回答