>

@echo off
for /f "tokens=1,2 delims=," %%x in (my.csv) do (
if %M% LSS %%x set M=%%x
)
echo Max X Value= %M%

때로는 잘 작동하고 때로는 다음과 같은 오류로 실패합니다 :

%x was unexpected at this time.

  • 답변 # 1

    문제는 당신이 %m% 를 사용하고 있다는 것입니다   for 내부  고리. 루프를 읽을 때 (반복 전에) 평가됩니다. 즉, 닫는 괄호까지 포함하여 전체 루프를 읽고 실행하기 전에 평가합니다. 그래서 %m%  루프 내에서 실제로 설정 한 값에 관계없이 항상 초기 값입니다.

    예를 들어 이것을 희망적으로 설명해야한다 :

    set val=7
    for %%i in (1) do (
        set val=99
        echo %val%
    )
    echo %val%
    
    

    이로 인해 예기치 않은 결과가 발생했습니다 :

    7
    99
    
    

    간단히 %val%  첫 번째 반향 문에서 해석됩니다 (즉, 전체 for  루프가 해석되기 전에 실행됩니다.

    m 의 가치를 강요하는 무언가와 함께 확장 지연이 필요합니다  첫 번째 %%x 로 설정  상관없이. setlocal 사용하기  명령과 !m!   %m% 대신   m 의 평가를 지연시킬 것입니다  줄이 실행될 때까지

    또한 m 설정  처음에는 아무것도하지 않고 그것을 %%x 로 강요  그것이있을 때아무것도 %%x 의 첫 번째 가치를 보장하지 않습니다   m 에로드 .

    @echo off
    setlocal enableextensions enabledelayedexpansion
    set m=
    for /f "tokens=1,2 delims=," %%x in (my.csv) do (
        if "!m!" == "" set m=%%x
        if !m! lss %%x set m=%%x
    )
    echo Max X Value = !m!
    endlocal
    
    

    my.csv 와 함께 위의 코드 사용  파일 :

    1,a
    2,b
    10,c
    3,d
    
    

    결과 :

    Max X Value = 10
    
    

    예상했거나 다른 의견의 샘플 데이터 :

    422,34
    464,55
    455,65
    421,88
    
    

    당신은 얻는다 :

    Max X Value = 464
    
    

  • 답변 # 2

    M 라는 환경 변수가 없습니다  이 줄을 해석하면 :

    if %M% LSS %%x set M=%%x
    
    

    1 차 교체 후, 통역사에게

    if LSS %x set M=%x
    
    

    paxdiablo가 %M% 에 대해 언급 한 문제를 피하기 위해 루프가 처음 일 때만 확장되는 경우, 그가 논의한 지연 확장 기능을 사용하거나 테스트 및 설정 이동 및 M 를 설정할 수 있습니다  루프에서 호출되지만 루프 외부에 존재하는 서브 루틴으로 연결되어 각 호출에서 해석 (및 확장)됩니다.

    @echo off
    set M=
    for /f "tokens=1,2 delims=," %%x in (my.csv) do (
        call :setmax %%x
    )
    echo Max X Value= %M%
    goto :eof
    :setmax
    if "%M%" == "" set M=%1
    if %M% LSS %1 set M=%1
    goto :eof
    
    

  • 답변 # 3

    문제는 if %M% 에 있습니다  성명서. % M %는 어디에 있습니까? 먼저 선언하십시오.

    @echo off
    set M=""
    for /f "tokens=1,2 delims=," %%x in (file) do (
    if %M% LSS %%x set M=%%x
    )
    echo Max X Value= %M%
    
    

    대안, vbscript를 사용할 수 있습니다

    Set objFS = CreateObject("Scripting.FileSystemObject")
    Set objArgs = WScript.Arguments
    strFile = objArgs(0)
    Set objFile = objFS.OpenTextFile(strFile)
    t=0
    Do Until objFile.AtEndOfStream
        linenum = objFile.Line
        strLine = objFile.ReadLine  
        s = Split(strLine,",")
        For Each num In s       
            WScript.Echo "num "&num
            If Int(num) >= t Then
                t=Int(num)
            End If  
        Next
        WScript.Echo "Max for line:" & linenum & " is " & t
    Loop
    
    

    예제 출력

    C:\test>type file
    422,34464,55455,65421,88
    C:\test>cscript //nologo test.vbs file
    Max for line:1 is 65421
    
    

    업데이트 : 현명한 최대 값 열을 찾으려면

    Set objFS = CreateObject("Scripting.FileSystemObject")
    Set objArgs = WScript.Arguments
    strFile = objArgs(0)
    Set objFile = objFS.OpenTextFile(strFile)
    t=0
    Do Until objFile.AtEndOfStream
        linenum = objFile.Line
        strLine = objFile.ReadLine  
        s = Split(strLine,",")
        If Int(s(0)) >= t then      
                t=Int(s(0))
        End If      
    Loop
    WScript.Echo "Max is " & t & " (line: " & linenum & ")"
    
    

    출력

    C:\test>type file
    422,34
    464,55
    455,65
    421,88
    C:\test>cscript //nologo test.vbs file
    Max is 464 (line: 2)
    
    

관련 자료

  • 이전 python - 위의 변수 위도에 목록 데이터를 저장하는 방법은 무엇입니까?
  • 다음 c# - 고유 한 목록 값 가져 오기