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

Batch file 使用延迟扩展限制拆分字符串,batch-file,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,因为我正在通过循环更新a和b的值,所以也需要使用延迟

在测试脚本时,我在尝试使用批处理从字符串中提取字符时遇到了这个问题。我把它简化为一个简单的例子
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
for的一个限制?

只需将变量
a
b
转换为变量即可

@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

混合延迟和正常膨胀将起作用

@echo off
setlocal EnableDelayedExpansion
set a=0
set b=1
for /f %%L in (t.txt) do (
  set "x=%%L"
  echo !x:~%A%,%B%!
)

即使这样也太复杂了+1:对。我想到了这一点,但我认为OP有一个合理的理由,为什么不能使用即时扩展。这个问题意味着示例代码是简化的,我认为它不是一个好的示例。