Batch file 为文件夹中的文本文件编号

Batch file 为文件夹中的文本文件编号,batch-file,Batch File,我把一些文本文件放在与批处理文件相同的文件夹中。我需要批处理文件在没有扩展名的情况下用编号逐行回显文件名。它必须按字母顺序排列。此外,它还需要将文件名存储到变量fruitx中,其中x是其编号的编号。例如 如果文件夹中有三个文件: 香蕉.txt Cherry.txt Apple.txt 我需要批处理文件来回显: 1) 苹果 2) 香蕉 3) 樱桃 然后,我需要变量%fruit1%为“苹果”、%fruit2%为“香蕉”、%fruit3%为“樱桃” 这是我的密码。它不起作用,我也不知道为什么。它对每个

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

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

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

然后,我需要变量%fruit1%为“苹果”、%fruit2%为“香蕉”、%fruit3%为“樱桃”

这是我的密码。它不起作用,我也不知道为什么。它对每个数字都回显0


如果这听起来让人困惑,很抱歉。提前谢谢

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

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

要解决这个问题,您需要启用延迟扩展,并且在需要时,将语法从
%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
@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
@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