【问题标题】:remove the directory from output in batchfile从批处理文件的输出中删除目录
【发布时间】:2016-11-04 13:15:24
【问题描述】:

我有以下输出 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

我想删除目录输出T:\EMP\SST 所以我希望我的输出是这样的

file 11
file 12
file 13

如何做到这一点

【问题讨论】:

  • 您的代码和示例输出不匹配!请相应地重新检查并edit您的问题...
  • @aschipfl 我不得不重命名其中的某些内容.. 但它是一样的,如果您需要任何解释,请告诉我。我只是要求一个命令或一种方法来删除输出中的directory
  • 谢谢!所以file 11等都是子目录吧?
  • @aschipfl file 11 是文件名而不是文件夹名
  • Hmm... for /R 枚举 目录树,而不是文件,但您声称您的输出包含像 T:\EMP\SST\file 11\T:\EMP\SST 这样的行,这不是您的代码的结果;所以请协调您的代码和示例数据;否则问题只是令人困惑......

标签: windows batch-file for-loop


【解决方案1】:

我相信您实际上需要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 仅在遇到通配符时才会访问文件系统。这解释了你奇怪的输出。

【讨论】:

    【解决方案2】:

    您以错误的方式使用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 /?),但事实是:所有有用的东西都在里面,所以我一直都在这样做:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-20
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多