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

Windows 如何递归搜索文件,但仅对使用批处理文件找到文件的实例进行操作?,windows,batch-file,cmd,automation,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

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

不知什么原因,我整个上午都在忙这个。我已经产生了下面的代码

@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循环或语法的用法的?

我已经修改了批处理脚本

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


@ECHO关闭
设置路径=C:\Users\\
设置文件名=EnterpriseSettings*.config
对于(%filename%)中的/R%path%%%f,请执行以下操作(
回声%%pf
)
暂停

我还使用了
~p
习惯用法,即
仅提取路径
,可在以下位置找到:

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

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"
)

您的代码很可能出现问题,因为
For/R
,(和
For/D
)期望使用通配符模式

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

  • 使用通配符
    *
    (“EnterpriseSettings.conf*g”)

  • 使用
    wldcard
    (“EnterpriseSettings.c?nfig”)

    必须注意,即使小心放置通配符,也可能会匹配非必需的文件
  • 使用不同的方法,例如
    Dir
    Where
    命令及其递归选项。
    这应该只匹配精确的文件名,如下例

@Echo关闭
SetLocal EnableExtensions DisableDelayedExpansion
设置“dirBase=D:\Workspaces\fwarrener lglesias\Example\Example\Clients”
设置“fileName=EnterpriseSettings.config”
如果/I不是“%\uuuu CD\uuuuu%”,则为“%dirBase%\”(
PushD“%dirBase%”2>Nul&&(设置“=$”)||退出/B
)
对于/F“Delims=“%%A In('Dir/B/S/A-D-S-L”%fileName%%“2^>Nul'),执行Echo%%~dpA
暂停
如果“%\%”=“$”PopD
端部
如前面所示,使用
dir
命令是一个很好的解决方案,我更喜欢这样

另一种方法是使用
for/R
,就像您已经做的那样,但是如果存在
,则添加
,如下所示:

对于/R“D:\Workspaces\fwarrener lglesias\Example\Example\Clients”%%x in(“EnterpriseSettings.config”)do(
如果存在“%%~x”如果不存在“%%~x\”(
echo%%~nxx
echo%%~dpx
)
)
如果不存在
部分与项加上尾部的
\
将排除具有匹配名称的目录

另一种方法是添加通配符(
,在本例中)以强制
for
访问文件系统并检查匹配的文件,但要针对误报过滤结果:

对于/R“D:\Workspaces\fwarrener lglesias\Example\Example\Clients”%%x in(“EnterpriseSettings?.config”)do(
如果/I“%%~nxx”==“EnterpriseSettings.config”(
echo%%~nxx
echo%%~dpx
)
)

由于PS对
文件系统有更多的控制权,您是否可以简单地将其迁移到
Powershell
。运行批处理有什么特别的原因吗?@Alex我没有考虑到这一点,因为我不需要多次这样做,这实际上是一个更大任务的一个小部分。我正在尝试使用Microsoft的TFS CLU以编程方式编辑和签出文件,这些路径将是我解析为TFS映射的路径。我的印象是,在批处理文件中执行此操作相当简单。:)我需要批处理,因为这段代码将在批处理脚本中,用于自动化某些源代码管理内容。@ThomasWeller我希望输出目录,但仅当文件在其中时才输出。这就是我认为in()的全部意义所在?D:\Workspaces\fwarrener lglesias\Example\Example\Clients\Example\Example\Config\Stage\是正确的路径。以前的其他人都是这样做的吗?使用
EnterpriseSettings*.config
可能解决了这个问题,但可能包含误报。至少它看起来不是一个bug。人们知道它的时间更长:还要注意,该网站说“必须使用通配符”。看到旧操作系统甚至DOS的帮助文本会很有趣。你没有解释OP的问题是什么,他的错误在哪里。您不考虑OP的要求。他不仅要列出文件,还要处理它们(请参见
%%~nxx
),这在
dir
中是不可能的。这在您的解决方案中是不可能的。Alex,这对于列出文件非常有效,是一个很好的解决方案,但不适合我的其他代码,因为我需要在找到每个路径时对其进行操作。我投了赞成票,因为这对获取所有路径很有用,并且可以解决,但是我正在寻找如何使用for-loop来实现这一点。@FelipeWarrener Iglesias,如果您有现有的代码,并且希望解决方案可以与之集成,请包含该代码。不要期望响应者拿出他们的时间和专业知识来提供不符合您隐藏要求的答案。您提供的问题仅限于
echo
es带扩展名的名称和带路径的驱动器@Compo:这正是a应该做的:编写尽可能少的代码来演示问题,而不在其余需求上添加太多细节。@C
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"
)