使用批处理文件的每一行的长度

时间:2013-03-27 10:18:21

标签: batch-file

我想逐行读取一个CSV文件,如果该行的长度是7999,则回显一些不同的东西。

我设法做了如下的事情,它读取每一行并检查每行的字符数,但问题是我在%result%中没有得到任何值,echo(%result%打印一个空值。知道我在这里做错了什么吗?感谢

@echo off
setlocal
for /f "tokens=* delims= " %%a in (REPORTS.csv) do (
    set "line=%%a"
    call :strlen result line
    echo(%result%
    if %result% EQU 7999 (
        echo %%a
        echo(short=%result%
    ) else (
        echo %%a
        echo(long=%result%
    )

    pause
)
:strlen <resultVar> <stringVar>
(
    setlocal EnableDelayedExpansion
    set "s=!%~2!#"
    set "len=0"
    for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
        if "!s:~%%P,1!" NEQ "" ( 
            set /a "len+=%%P"
            set "s=!s:~%%P!"
        )
    )
)
( 
    endlocal
    set "%~1=%len%"
    exit /b
)

2 个答案:

答案 0 :(得分:1)

将此部分放入另一个子程序,类似于:strlen

echo(%result%
if %result% EQU 7999 (
    echo %%a
    echo(short=%result%
) else (
    echo %%a
    echo(long=%result%
)

另请注意,您的主例程将在完成后继续进入子例程,因此在文件结束时(reports.csv),批处理将最后一次执行:strlen并通过EXIT退出

我建议添加

GOTO :EOF

紧接:strlen标签之前。处理器可以理解为物理文件结束(冒号必需

当要执行括在括号中的复合语句时, 该语句首先从所有的开括号中解析出来 匹配近括号的方法。

目前,任何%var%都会被var的{​​{1}}替换 环境在它被分配的时间(即其 PARSE-TIME 值。)

THEN 如果语句似乎有效,则执行。

有三种常用方法可以访问 RUN-TIME 值 变量(例如,作为FOR循环执行。)

1 / SETLOCAL ENABLEDELAYEDEXPANSION切换到其中的模式 !VAR!可用于访问var的运行时值 2 / CALL set var2=%%var%%设置var2的值 var的运行时值 3 /执行%var%内部或外部子程序 将是运行时值。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%i IN (1 2 3) DO (
ECHO START of run %%i
ECHO using ^!time^! : !time! - PARSE TIME was %time%
CALL ECHO using CALL %%%%TIME%%%% : %%TIME%%
CALL :report
timeout /t 5
ECHO using ^!time^! : !time!
CALL ECHO using CALL %%%%TIME%%%% : %%TIME%%
CALL :report
ECHO END of run %%i
ECHO.
)
GOTO :eof

:report
ECHO :report says TIME is %TIME%
GOTO :eof

需要注意的几个项目:

  1. 指令

    如果ERRORLEVEL n echo errorlevel是n OR GREATER

    始终 解释ERRORLEVEL

  2. 的RUN-TIME值
  3. IF SET VAR 始终 解释VAR

  4. 的RUN-TIME值
  5. 永远不应该像{ERRORLEVEL和TIME一样magic variables 设定。如果你执行

    SET ERRORLEVEL = dumb

  6. 然后ERRORLEVEL将采用值dumb,因为当前 环境中的值优先于系统分配的值。

答案 1 :(得分:0)

您应该在iffor循环中使用DelayedExpansion并处理括号:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims= " %%a in (REPORTS.csv) do (
set "line=%%a"
call :strlen result line
echo.!result!
if !result! EQU 7999 (
    echo.%%a
    echo.short=!result!
) else (
    echo.%%a
    echo.long=!result!
)
)
pause 
goto:eof    

:strlen <resultVar> <stringVar>
setlocal EnableDelayedExpansion
set "s=!%~2!#"
set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
    if "!s:~%%P,1!" NEQ "" ( 
        set /a "len+=%%P"
        set "s=!s:~%%P!"
    )
)
endlocal &set "%~1=%len%"
exit /b

您的代码在许多方面都不起作用。