Batch file 使用批处理文件的每行的长度
我想逐行读取CSV文件,如果行的长度是7999,则回显不同的内容 我设法做了如下操作,读取每一行并检查每一行的字符数,但问题是我在%result%中没有得到任何值,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
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
,因为当前
环境中的值优先于系统指定的值