在批处理循环中获取文件名

44

我在批处理文件中有如下的For循环:

for /R c:\test\src %%i IN (*.*) DO (
MOVE %%i C:\test\destination
ECHO %%i
exit
)

ECHO输出的结果是整个文件路径,例如:C:\Foldername\Filename。 我需要仅输出Filename。有没有特定的命令可以给我文件名? 谢谢!


6
顺便提一句,如果您使用的是本世纪制作的 Windows 版本,那么您使用的不是 DOS,而是 Windows 命令提示符。 - whatsisname
5个回答

83

当启用命令扩展(Windows XP及更高版本)时,您可以使用语法%~nF(其中F是变量,~n是请求其名称),仅获取文件名。

FOR /R C:\Directory %F in (*.*) do echo %~nF

应该只回显文件名。


18
如果你想看到文件扩展名,就在结尾处添加 %~xF。 - akf
39
使用%~nxf可以获取带有扩展名的文件名。 - Helen
1
@Dave:for %f in (*.*)(或者 for %f in (c:\directory\*.*))应该可以工作。 - AKX
6
这个命令在我的Win7 64位系统上无法运行。出现错误信息:"~nF 在此时是意外的"。请问有什么解决办法吗? - Dimitri Kopriwa
2
如果这个命令在批处理文件中,请不要忘记使用双百分号:echo %%~nF - Richard Whitehead
显示剩余8条评论

4

@AKX的答案适用于命令行,但在批处理文件中无效。在批处理文件中,需要额外添加%,像这样:

@echo off
for /R TutorialSteps %%F in (*.py) do echo %%~nF

4
或者,只需使用 %~F 即可获得完整路径和完整文件名。
例如,如果您想在当前目录中注册所有 *.ax 文件....
FOR /R C:. %F in (*.ax) do regsvr32 "%~F"

这在Win7(64位)上运行得非常好 :-)


3

我有点晚了,但我使用了这个:

dir /B *.* > dir_file.txt

然后您可以编写一个简单的FOR循环来提取文件名并使用它们。例如:

for /f "tokens=* delims= " %%a in (dir_file.txt) do (
gawk -f awk_script_file.awk %%a
)

或将它们存储到变量中(!N1!,!N2!..!Nn!)以备后用。例如:

set /a N=0
for /f "tokens=* delims= " %%a in (dir_file.txt) do (
set /a N+=1
set v[!N!]=%%a
)

gawk并不是随处可用的。 - Li3ro

1
如果您想保留文件名和扩展名,可以使用%~nxF
FOR /R C:\Directory %F in (*.*) do echo %~nxF

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