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

Batch file 使用批处理文件的每行的长度,batch-file,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(%r

我想逐行读取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
)
@echo关闭
setlocal
对于(REPORTS.csv)do中的/f“tokens=*delims=“%%a(
设置“行=%%a”
呼叫:斯特伦结果行
回显(%result%)
如果%result%eq 7999(
回声%%a
回声(短=%result%
)否则(
回声%%a
回声(长=%result%
)
暂停
)
:斯特伦
(
setlocal EnableDelayedExpansion
设置“s=!%~2!#”
设置“len=0”
对于%%P in(4096 2048 1024 512 256 128 64 32 16 8 4 2 1),请执行以下操作(
如果“!s:~%%P,1!”NEQ”“(
设置/a“len+=%%P”
集合“s=!s:~%%P!”
)
)
)
( 
端部
设置“%~1=%len%”
退出/b
)

您应该在
if
中为
循环使用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
@echo关闭
延迟扩展
对于(REPORTS.csv)do中的/f“tokens=*delims=“%%a(
设置“行=%%a”
呼叫:斯特伦结果行
回声!结果!
如果!结果!EQU 7999(
回声%%a
echo.short=!结果!
)否则(
回声%%a
echo.long=!结果!
)
)
暂停
后藤:eof
:斯特伦
setlocal EnableDelayedExpansion
设置“s=!%~2!#”
设置“len=0”
对于%%P in(4096 2048 1024 512 256 128 64 32 16 8 4 2 1),请执行以下操作(
如果“!s:~%%P,1!”NEQ”“(
设置/a“len+=%%P”
集合“s=!s:~%%P!”
)
)
endlocal&设置“%~1=%len%”
退出/b

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

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

echo(%result%
if %result% EQU 7999 (
    echo %%a
    echo(short=%result%
) else (
    echo %%a
    echo(long=%result%
)
还请注意,完成后,主例程将继续进入子例程,因此在文件(reports.csv)末尾,批处理将执行最后一次
:strlen
,并通过
退出退出

我建议添加一个

GOTO :EOF
紧靠
:strlen
标签之前。处理器理解为转到PhysicalL文件的末尾(冒号是必需的

当要执行括号内的复合语句时, 该语句首先从所有 找到匹配的右括号的方法

此时,任何
%var%
都将被 解析时的环境(即其解析时间值)

然后如果该语句似乎有效,则执行该语句

有三种常见的方法可以访问 变量(例如,作为
循环的
执行。)

1/
SETLOCAL ENABLEDELAYEDEXPANSION
切换到以下模式: !var!可用于访问
var
2/
调用set var2=%%var%%
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
需要注意的几个事项:

  • 指令

    如果ERRORLEVEL n echo ERRORLEVEL为n或更高

    始终解释
    ERRORLEVEL的运行时值

  • IF SET VAR
    始终解释
    VAR

  • 像ERRORLEVEL和TIME这样的
    魔术变量不应该
    如果你执行

    设置ERRORLEVEL=dumb

  • 然后
    ERRORLEVEL
    将采用值
    dumb
    ,因为当前 环境中的值优先于系统指定的值