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有一个合理的理由,为什么不能使用即时扩展。这个问题意味着示例代码是简化的,我认为它不是一个好的示例。