我有以下批量文件输出ReadFile.txt文件
cd /d "T:\EMP\SST"
for /r %%i in (T:\EMP\SST) do echo %%i >>D:\MultiThreading\ReadFile.txt
pause
此ReadFile.txt文件输出
T:\EMP\SST\T:\EMP\SST
T:\EMP\SST\file 11\T:\EMP\SST
T:\EMP\SST\file 12\T:\EMP\SST
T:\EMP\SST\file 13\T:\EMP\SST
我想删除目录ouptput T:\EMP\SST
所以我希望我的输出像这样
file 11
file 12
file 13
如何做到这一点
答案 0 :(得分:2)
我认为您的任务实际上需要for /D
而不是for /R
(因为我认为file 11
,file 12
,file 13
实际上是目录,因为它们是由for /R
枚举:
for /D %%I in (T:\EMP\SST\*) do echo %%~nxI
无论如何,你的for /R
语法错了;你想要递归枚举的目录需要在/R
开关之后立即声明(如果你省略它,假设当前目录),你需要提供一个集合(括号之间的部分)仅构成纯文件名模式,没有任何(绝对或相对)路径,例如*.*
,以匹配所有文件。
在您的代码中,for /R
枚举当前目录。由于您的集合为T:\EMP\SST
并且不包含通配符(*
,?
),因此它只是字面上附加到枚举目录,因为for
仅在以下情况下访问文件系统遇到通配符。这解释了你奇怪的输出。
答案 1 :(得分:1)
您以错误的方式使用FOR
。括号之间的模式不是起始目录,而是您要匹配的文件/目录模式。在这里,我想你想要*.*
如果您只想要文件名(根本没有路径),您可以写:
@echo off
for /r T:\EMP\SST %%i in (*.*) do echo %%~nxi>>D:\MultiThreading\ReadFile.txt
如果你想要文件名+相对路径,它稍微复杂但可行,通过启用延迟扩展能够删除路径前缀+反斜杠:
@echo off
setlocal enabledelayedexpansion
set start_path=T:\EMP\SST
for /r %start_path% %%i in (*.*) do (
set f=%%i
echo !f:%start_path%\=!>>D:\MultiThreading\ReadFile.txt
)
这个FOR
命令很神秘,我每次都必须阅读帮助(FOR /?
),但事实是:一切都很有用,所以我一直这样做:)