我将一些文本文件放在与批处理文件相同的文件夹中。我需要批处理文件来回显文件名而不用扩展名逐行编号。它必须按字母顺序排列。此外,它需要将文件名存储到变量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。
对不起,如果这听起来很混乱。提前谢谢!
答案 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