Numbering text files in a folder

前端 未结 2 952
没有蜡笔的小新
没有蜡笔的小新 2020-12-20 01:25

I have some text files placed in the same folder as a batch file. I need the batch file to echo the filenames without its extention line by line with a numbering. It has to

相关标签:
2条回答
  • 2020-12-20 02:10
    @echo off
    setlocal enableDelayedExpansion
    set counter=0
    for /f %%a in ('dir /b /a:-d /o:n *.txt') do (
        set /a counter=counter+1
        echo !counter! ^) %%~na
        set "fruit!counter!=%%~na"
    )
    
    echo listing fruits
    set fruit
    
    0 讨论(0)
  • 2020-12-20 02:30

    When the cmd parser reads a line or a block of lines (the code inside the parenthesis), all variable reads are replaced with the value inside the variable before starting to execute the code. If the execution of the code in the block changes the value of the variable, this value can not be seen from inside the same block, as the read operation on the variable does not exist, as it was replaced with the value in the variable.

    This same behaviour is seen in lines where several commands are concatenated with &. The line is fully parsed and then executed. If the first commands change the value of a variable, the later commands can not use this changed value because the read operation replace.

    To solve it, you need to enable delayed expansion, and, where needed, change the syntax from %var% to !var!, indicating to the parser that the read operation needs to be delayed until the execution of the command.

    In your case, the problematic variable is x, that changes its value inside the loop and needs this value inside the same loop

    @echo off
    
        setlocal enableextensions enabledelayedexpansion
    
        set "x=0"
        for /f "delims=" %%a in ('dir /a-d /b /on *.txt 2^>nul') do (
            set /a "x+=1"
            echo !x!^) %%~na
            set "fruit!x!=%%~na"
        )
        echo(---------------------------
        set fruit
    

    Also, an alternative approach without delayed expansion can be to filter the generated list of files with findstr to generate the number for each element

    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        for /f "tokens=1,2 delims=:" %%a in ('dir /a-d /b /on *.txt 2^>nul ^| findstr /n "^"') do (
            echo %%a^) %%~nb
            set "fruit%%a=%%~nb"
        )
        echo(---------------------------
        set fruit
    
    0 讨论(0)
提交回复
热议问题