如何递归搜索文件,但仅对使用批处理文件找到文件的实例进行操作?

时间:2018-06-06 11:10:34

标签: windows batch-file cmd automation

我的脚本的目标是在给定起始路径的情况下以递归方式搜索单个文件名(其中存在该名称的文件存在于不同文件夹中)并输出找到的每个文件的路径,不包括名称和扩展名。

出于某种原因,我整个上午都被困在这上面。我已经制作了以下代码。

@echo off

for /r D:\Workspaces\fwarrener-lglesias\Example\Example\Clients %%x in (EnterpriseSettings.config) do (
    echo %%~nxx
    echo %%~dpx
)

我受到其他人的答案和文档的印象,如果找到括号内的文件,这只会执行'do'子句中的命令。但是,当执行和管道输入文件时,我有一个非常多的不必要的行,因为即使没有找到该文件,它也会输出它所在的目录。我对此感到困惑,因为我认为指定一个集合的重点是do中的命令只会在找到文件名的实例中执行。

D:\Workspaces\fwarrener-lglesias\Example\Example\Clients\Example\
D:\Workspaces\fwarrener-lglesias\Example\Example\Clients\Example\Example\
D:\Workspaces\fwarrener-lglesias\Example\Example\Clients\Example\Example\Config\
D:\Workspaces\fwarrener-lglesias\Example\Example\Clients\Example\Example\Config\Stage\

对于我如何错误解释for-loop或语法的用法,有没有人能够理解我?

4 个答案:

答案 0 :(得分:1)

使用DIR命令执行此操作似乎更为明显。请参阅/A:-D-S-L命令输出中DIR /?的含义。

FOR /F "tokens=*" %%x IN ('DIR /S /B /A:-D-S-L "D:\Workspaces\fwarrener-lglesias\Example\Example\Clients\EnterpriseSettings.config"') DO (
    echo "%%~nxx"
    echo "%%~dpx"
)

答案 1 :(得分:1)

您的代码存在问题的可能性很大,因为For /R(和For /D会产生通配符模式。

这可以通过以下方式解决:

  • 使用*通配符("EnterpriseSettings.conf*g")
  • 使用? wldcard ("EnterpriseSettings.c?nfig") 但必须注意的是,即使仔细放置通配符,也可能无法匹配非必需文件。
  • 使用其他方法,例如DirWhere命令及其递归选项。
    这应该只匹配确切的文件名,例如。< / LI>
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

Set "dirBase=D:\Workspaces\fwarrener-lglesias\Example\Example\Clients"
Set "fileName=EnterpriseSettings.config"

If /I Not "%__CD__%"=="%dirBase%\" (
    PushD "%dirBase%" 2>Nul && (Set "_=$") || Exit /B
)

For /F "Delims=" %%A In ('Dir /B/S/A-D-S-L "%fileName%" 2^>Nul') Do Echo %%~dpA
Pause

If "%_%"=="$" PopD
EndLocal

答案 2 :(得分:0)

正如this answer所示,使用dir命令是一个很好的解决方案,我更喜欢。

另一种方法是使用for /R,但要添加if exist,如下所示:

for /R "D:\Workspaces\fwarrener-lglesias\Example\Example\Clients" %%x in ("EnterpriseSettings.config") do (
    if exist "%%~x" if not exist "%%~x\" (
        echo %%~nxx
        echo %%~dpx
    )
)

项目加尾随if not exist的{​​{1}}部分会排除名称匹配的目录。

另一种方法是在此示例中添加一个通配符(\)以强制?访问文件系统并检查匹配的文件,但过滤结果以防止误报:

for

答案 3 :(得分:-1)

我修改了我的批处理脚本。

告诉我这是否对您有任何帮助:

@ECHO OFF

SET path=C:\Users\<USER>\<DIRS>
SET filename=EnterpriseSettings*.config

For /R %path% %%f in (%filename%) do (
    echo %%~pf
)

PAUSE

我还使用了~p惯用法,Extract the path only找到了{{1}}