编号文件夹中的文本文件

时间:2014-07-30 08:44:52

标签: batch-file

我将一些文本文件放在与批处理文件相同的文件夹中。我需要批处理文件来回显文件名而不用扩展名逐行编号。它必须按字母顺序排列。此外,它需要将文件名存储到变量fruitx中,其中x是其编号的编号。例如......

如果文件夹中有三个文件:
Banana.txt Cherry.txt Apple.txt

我需要批处理文件来回显:
1)Apple
2)香蕉
3)樱桃

然后,我需要变量%fruit1%be" Apple",%fruit2%be" Banana"和%fruit3%是" Cherry"。

    set x=0
    for /F "tokens=* delims=" %%I in ('dir /b *.txt') do (
    set /a x=x+1&echo %x%^) %%~nI&set fruit%x%=%%~nI)
    echo %x%

这是我的代码。它不起作用,我无法弄清楚原因。它代替了每个编号的回声0。

对不起,如果这听起来很混乱。提前谢谢!

2 个答案:

答案 0 :(得分:3)

当cmd解析器读取一行或一行(括号内的代码)时,所有变量读取都将替换为变量中的值开始执行代码之前。如果块中代码的执行会更改变量的值,则无法从同一块内部看到此值,因为变量的读取操作不存在,因为它已替换为变量中的值。

在几行命令与&连接的行中可以看到同样的行为。该行被完全解析然后执行。如果第一个命令更改了变量的值,则后面的命令不能使用此更改的值,因为读取操作将替换。

要解决此问题,您需要启用延迟扩展,并在需要时将语法从%var%更改为!var!,向解析器指示读取操作需要延迟执行命令。

在您的情况下,有问题的变量是x,它在循环内更改其值并在同一循环中需要此值

@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

此外,没有延迟扩展的替代方法可以是使用findstr过滤生成的文件列表,以生成每个元素的编号

@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

答案 1 :(得分:0)

@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