当我测试脚本时,我尝试使用批处理从字符串中提取字符时遇到此问题。我把它简化成一个简单的例子。 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
?
答案 0 :(得分:3)
只需将变量a
和b
转移到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%!
)