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