2013-03-27 102 views
0

我想讀通過線CSV文件中的行和回聲不同的東西,如果線的長度是7999長度使用批處理文件

我能做到下面的東西,它讀取每行每行和檢查每行的字符數,但問題是我沒有得到%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 
) 

回答

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 

您的代碼不會永遠在許多領域的工作。

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 

Imme在:strlen標籤之前。這是由處理器所理解去結束physiacl文件(冒號是需要

當包含在括號中的複合語句將被執行, 語句首先從開括號解析所有的 方式匹配的左括號。

在這個時候,任何%var%var的值代替從 環境在當時被解析(即其分析時值。)

THEN如果聲明似乎有效,它被執行。

有訪問 變量的RUN-TIME值的三種常用的方法(作爲一個FOR循環的執行方式,例如。)

1/SETLOCAL ENABLEDELAYEDEXPANSION其切換到一個模式,其中 !變種!可用於訪問的var 2/CALL set var2=%%var%%運行值與來自的var 3 /執行子程序,內部或外部的在其內%var% 將是運行值 運行值設置的var2值。

@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. 指令

    IF ERRORLEVELñ回聲錯誤級別爲n或更大

    ALWAYS解釋運行時值ERRORLEVEL

  2. IF SET VARALWAYS解釋的VAR

  3. magic variables像ERRORLEVEL運行時間值和時間應永遠 設置。如果執行

    SET ERRORLEVEL =啞

然後ERRORLEVEL將採用價值dumb因爲在當前環境下的 值在系統指定的值優先。