2012-11-23 24 views
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需要使用延迟扩展被访问的变量,因为我通过循环更新的ab值这些还需要使用膨胀延迟来访问。

当试图使用变量ab拆分字符串时,他们都需要延迟扩展,但!标记的顺序意味着它不按我的意图分析!

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

我发现解决此问题的唯一方法是调用不在循环中的外部函数,因此我可以使用%'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对于什么办法?

回答

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 
+0

我知道这会很简单,谢谢! –

+0

即使这太复杂了 – jeb

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%! 
) 
+0

+1:true。我想到了这一点,但我认为OP有正当理由不能使用即时扩展。这个问题意味着示例代码是一种简化,我认为它不是一个好例子。 – dbenham