从批处理文件中的输出中删除目录

时间:2016-11-04 13:15:25

标签: windows batch-file for-loop

我有以下批量文件输出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

如何做到这一点

2 个答案:

答案 0 :(得分:2)

我认为您的任务实际上需要for /D而不是for /R(因为我认为file 11file 12file 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 /?),但事实是:一切都很有用,所以我一直这样做:)