在批处理脚本中循环遍历文件名

4

我想要一个批处理脚本来处理文件夹中的所有文本文档。 这是我目前为止完成的:

@ECHO off
title Test
set dir1=C:\Users\Family\Desktop\Example

:Start
cls
echo 1. test loop
echo 2. Quit
set /p choice=I choose (1,2):
if %choice%==1 goto test
if %choice%==2 exit

:test
cls
echo running loop test 
FOR %%n in (%dir1% *.txt) DO echo %dir1%\%%n
echo Done
pause

我希望输出的内容是:

我想要输出的是:

running loop test
C:\Users\Family\Desktop\Example\doc 1.txt
C:\Users\Family\Desktop\Example\doc 2.txt
Done

但我得到了这个:
running loop test
C:\Users\Family\Desktop\Example\C:\Users\Family\Desktop\Example
C:\Users\Family\Desktop\Example\doc 1.txt
C:\Users\Family\Desktop\Example\doc 2.txt
Done
1个回答

12

主要问题似乎在于 (%dir1% *.txt) 之间的空格。

可能是

@ECHO off
title Test
set "dir1=C:\Users\Family\Desktop\Example"

:Start
cls
echo 1. test loop
echo 2. Quit
set /p choice=I choose (1,2):
if %choice%==1 goto test
if %choice%==2 exit

:test
cls
echo running loop test 
FOR %%X in ("%dir1%\*.txt") DO echo %%~dpnX
echo Done
pause

这些引号是为了避免路径中的空格或其他特殊字符出现问题。

编辑:
%%~dpnX 是用于将 %%X 的文件名扩展为
d=驱动器(C:)
p=路径(\Users\Family\Desktop\Example)
n=文件名(test1)(不带扩展名)

f=完整文件名(C:\Users\Family\Desktop\Example\test1.txt)。

可能使用的修饰符在此处得到解释:FOR /?


谢谢,那个完美地运行了。 你能解释一下 %%~dpfX 吗? - Krayons
3
%%~nX 表示仅文件名(test1),而带有扩展名的文件名应写作 %%~nxX(test1.txt)。 - Artem P
1
澄清一下:请注意,在他的代码中,“%%X”是找到的完整文件名。其他部分“dpn”是对“%%X”的修改器。因此,正如用户2nd所说,使用变量上的“n”修改器通过调用“echo %%~nX”来仅输出文件。 - Richard Le Mesurier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接