Cmd 递归搜索目录中的文件夹

Cmd 递归搜索目录中的文件夹,cmd,Cmd,在给定目录中查找文件(而不是文件夹)很简单,其工作原理如下: where/r GroupManagementAppServer test.js 返回文件夹GroupManagementAppServer中名为test.js的所有文件 但是,该命令在其他两个用例中失败: 用户指定与某个目录相关的路径名作为最后一个参数(例如,在第一个示例中,var/www/html/project/js/test.js,它位于GroupManagementAppServer中) 用户指定一个文件夹作为最后一个参数(

在给定目录中查找文件(而不是文件夹)很简单,其工作原理如下:

where/r GroupManagementAppServer test.js
返回文件夹
GroupManagementAppServer
中名为
test.js
的所有文件

但是,该命令在其他两个用例中失败:

  • 用户指定与某个目录相关的路径名作为最后一个参数(例如,在第一个示例中,
    var/www/html/project/js/test.js
    ,它位于
    GroupManagementAppServer
    中)
  • 用户指定一个文件夹作为最后一个参数(如第一个示例中的
    js

  • 我需要一些命令行逻辑来处理所有这些用例,这样我就可以实现我的逻辑来验证两个参数,这样我就可以完成编写作为代码“业务端”的例程。(我正在编写一个命令行脚本,该脚本为我的项目中的代码文件生成降价文件。我在这项任务上已经坚持了好几天,现在是时候继续做一些真正的工作了。)

    where命令只能搜索文件,不能搜索目录;改用
    dir
    ,它可以同时搜索文件(使用
    /A:-D
    )和目录(使用
    /A:D

    用例1
    dir/S
    可用于递归搜索与给定名称或模式匹配的项目,但不能用于搜索相对路径与给定路径匹配的项目。但是,您可以使用
    findstr
    过滤
    dir/S
    的输出,如下所示:

    rem//在此处定义常量:
    设置“RootDir=GroupManagementAppServer”
    设置“RelPath=var\www\html\project\js\test.js”
    rem/*让'dir'返回完整树中的所有文件,然后让'findstr'筛选匹配项;
    rem每个“\”都需要加倍,因为“findstr”将“\”用作转义字符:*/
    目录/B/S/A:-D“%RootDir%\*”| findstr/I/E/C:\\%RelPath:\=\\%
    
    用例2 实际上,我不太清楚您的意思,但我想您希望用户能够只输入文件
    test.js
    的直接父目录(如
    js
    )的名称或相对路径。我不知道您想如何区分文件和目录,除非我们可以假设目录名不包含扩展名

    假设我的假设是正确的,并且用户输入不包含任何通配符(
    *
    ),您可以使用
    for
    循环来确定是否存在扩展:

    rem//假设变量'RelPath'保存用户输入:
    对于“%RelPath%”中的%%I,请设置“EXT=%%~xI”
    rem//检查是否缺少扩展名:
    如果未定义EXT(
    rem/*没有扩展,因此假设用户输入是一个目录;
    因此,在这种情况下,让我们附加默认文件名'test.js'*/
    设置“RelPath=%RelPath%\test.js”
    )
    rem//继续使用用例1中的'dir`/'findstr'方法。。。
    
    如果用户指定要从中递归的目录和相对路径名,这意味着什么?相对路径名的根是否必须是第一个参数的子目录?或者相对路径名的存在是否意味着“不递归”?或者其他什么?例如,如果我想在
    GroupManagementAppServer
    中查找路径为var/www/html/project/js/test.js的文件,该路径与
    GroupManagementAppServer
    中的某个目录相关,我应该能够做到这一点并获得它的路径。为了问题的清晰性,我又添加了一些单词。
    where/r
    不适用于文件夹
    dir/s/b
    可以,但不幸的是,相对路径名不起作用。绕过此限制的一种方法是解析路径名的第一个文件夹,仅对该文件夹执行
    dir/s/b
    cd
    (或
    pushd
    ),然后检查路径名的其余部分是否存在。如果没有人能想出更好的解决方案,这会很麻烦,但也是可能的。关于
    dir/B/S/a:-D“GroupManagementAppServer\test.js”| findstr/I/E/C:“\var\www\html\project\js\test.js”
    ,因此
    dir
    递归返回根目录
    GroupManagementAppServer
    中找到的所有文件
    test.js
    ,并使用
    findstr
    过滤的列表匹配相对路径(您必须使用
    \
    作为路径分隔符;还要注意前导的
    \
    )?要对文件夹执行相同操作,请将
    /A:-D
    更改为
    /A:D