考虑下面的脚本,我想计算文件中的字符数。首先,我想计算线条并存储它。第二个给出计数行,我现在将计算字符数。过程应该是,字符数将扣除计算的行数。问题是,当我使用我的脚本时,命令将不再起作用,如果我的脚本特别使用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
答案 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
这有帮助吗?