0

CSVファイルを1行ずつ読み取り、行の長さが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
)
4

2 に答える 2

1

このセクションを別のサブルーチンに入れます。:strlen

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

また、メインルーチンは終了時にサブルーチンに続くため、ファイルの終わり(reports.csv)で、バッチは:strlen最後に1回実行され、EXIT

追加することをお勧めします

GOTO :EOF

:strlenラベルの直前。これは、プロセッサが物理ファイルの終わりに移動することを理解しています(コロンが必要です

括弧で囲まれた複合ステートメントを実行する場合、ステートメントは最初に開き括弧から対応する閉じ括弧まで解析されます。

この時点で、anyは、解析された時点での環境からのその値(つまり、PARSE-TIME値)%var%に置き換えられます。var

次に、ステートメントが有効であると思われる場合、それが実行されます。

変数のRUN-TIME値にアクセスする一般的な方法は3つあります(FORたとえば、ループの実行時)。

1 /SETLOCAL ENABLEDELAYEDEXPANSIONこれは!var!のモードに切り替わります。var 2 /の実行時値にアクセスして、3/の実行時値からのCALL set var2=%%var%%値を設定するために使用できます。実行時値となる 内部または外部のサブルーチンを実行し ます。var2var%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. 指示

    ERRORLEVELnエコーエラーレベルがn以上の場合

    常にのRUN-TIME値を解釈しますERRORLEVEL

  2. IF SET VAR 常にのRUN-TIME値を解釈しますVAR

  3. magic variablesERRORLEVELやTIMEなどは絶対に設定しないでください。実行した場合

    SET ERRORLEVEL = dumb

次に、環境内の現在の値がシステムによって割り当てられた値よりも優先されるため、ERRORLEVELその値を採用します。dumb

于 2013-03-27T11:58:35.583 に答える
0

ifループ内でDelayedExpansionを使用しfor、角かっこに注意する必要があります。

@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

あなたのコードは多くの分野で機能することはありません。

于 2013-03-27T11:52:46.860 に答える