如何使用SETLOCAL进行迭代和字符串操作?

时间:2015-02-25 15:24:17

标签: batch-file dos

考虑下面的脚本,我想计算文件中的字符数。首先,我想计算线条并存储它。第二个给出计数行,我现在将计算字符数。过程应该是,字符数将扣除计算的行数。问题是,当我使用我的脚本时,命令将不再起作用,如果我的脚本特别使用SETLOCAL

,我不会这样做
cls
@echo off

set ctr=0
set str=

setlocal enabledelayedexpansion
FOR /f "tokens=*" %%G IN (file.txt) DO (call :count "%%G")
GOTO :eof

:count
set /a ctr+=1
goto :eof


setlocal enabledelayedexpansion 
for /f "tokens=* delims=" %%i in (file.txt) do (set str=!str! %%i)

call :len "%str%" a

setlocal enabledelayedexpansion
set /a a-=ctr
echo The string has %a% characters.
endlocal
goto :eof


:len <string> <length_variable>

setlocal enabledelayedexpansion 
set l=0
set str=%~1

:len_loop
set x=!str:~%l%,1!
if not defined x (
endlocal
set "%~2=%l%"
goto :eof)
set /a l=%l%+1
goto :len_loop

1 个答案:

答案 0 :(得分:0)

对不起,如果我误解了你问题的重点,可以通过更简单的方法来获取文件的字符数。

for %%I in ("filename.txt") do echo %%~zI

会这样做。获取行数也很简单。

type "filename.txt" | find /v /c ""

您正在使用Rube Goldberg字符计数方法,如果您的文件包含空行,它会为您提供不正确的结果。如果您正在寻找:len子例程的帮助,那么这是基于jeb's :StringLength例程的更有效的替代方案:

:length <return_var> <string>
setlocal enabledelayedexpansion
set "tmpstr=%~2"
set ret=0
for %%I in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
    if not "!tmpstr:~%%I,1!"=="" (
        set /a ret += %%I
        set "tmpstr=!tmpstr:~%%I!"
    )
)
endlocal & set "%~1=%ret%"
goto :EOF

这有帮助吗?