以递归方式查找批处理文件中的特定目录

时间:2018-05-10 05:28:27

标签: batch-file

我正在尝试创建一个将作为构建脚本运行的批处理文件。我想将任何bin / debug目录中的所有dll从我的解决方案中的项目复制到特定目录。我只是不确定如何确定目录是否以for循环中的bin / debug结束。

for /D /R "D:\mysolution\" %%F in ( *.* ) DO (
    rem if directory ends in "bin\debug"
    copy %%F\*.dll %1
)

4 个答案:

答案 0 :(得分:2)

您需要delayedexpansion,因为我们set代码块中的变量( )

通常我们只是告诉它,如果文件夹= bin的最后3个字符或最后5个字符= debug,请执行以下操作:

@echo off
setlocal enabledelayedexpansion
for /D /R "D:\mysolution\" %%F in (*) DO (
   set "var=%%F"
   if /i "!var:~-3!"=="bin" copy "!var!\*.dll" %1
   if /i "!var:~-5!"=="debug" copy "!var!\*.dll" %1
)

这将复制名为dll bin debug SOME dir NAME debug等目录中的所有MYbin,但不会复制debug dir {{ 1}}等等。

修改

发表评论后,应该这样做:

bin dir

答案 1 :(得分:1)

@ECHO OFF
SETLOCAL
SET "sourcedir=m:\tokyo"
SET "destdir=u:\destdir"

FOR /r "%sourcedir%" %%a IN (*.dll) DO (
 FOR %%t IN ("%%~dpa.") DO (
  IF /i "%%~nxt" == "bin64" ECHO(copy "%%a" "%destdir%"
  IF /i "%%~nxt" == "bin" ECHO(copy "%%a" "%destdir%"
 )
)

GOTO :EOF

您需要更改sourcedirdestdir的设置以适合您的具体情况。

为了测试目的,所需的COPY命令仅为ECHO在您确认命令正确后,将ECHO(COPY更改为COPY以实际复制文件。附加>nul以取消报告消息(例如1 file copied

我选择从.dllM:\tokyo...\bin64目录中选择M:\tokyo...\bin个文件,以便于测试。

使用for/r找到从指定目录开始的所有.dll文件,并依次将每个文件分配给%%a

将文字(驱动器+路径)从%% a + .分配到%%t,产生直接父目录名作为"文件名"并与case-INsensitivity(/i)进行比较" filename"依次到每个所需的字符串。这样可以确保比较整个父目录名,因此我们不会对not_this_directory_even_though_its_a_bin这样的名称进行错误点击。

答案 2 :(得分:1)

您可以使用其他for loop~ modifiers来确定父目录的名称,然后让我们检查部分路径bin\debug

for /D /R "D:\mysolution\" %%J in ("*") do (
    for %%I in ("%%~dpJ.") do (
        if /I "%%~nxI\%%~nxJ"=="bin\debug" (
            copy "%%~J\*.dll" "%~1"
        )
    )
)

答案 3 :(得分:0)

根据您现在验证的意图,即结束\bin\debug的树,这预先过滤目录递归结果,然后在运行Copy命令之前验证名称:

@Echo Off
If "%~1"=="" (Exit /B) Else CD /D "%~1" 2>Nul && (Set "CP=Copy /Y "%%A\*.dll" 2>Nul") || Exit /B
For /D /R "D:\mysolution" %%A In (bin\d?bug) Do For %%B In ("%%~nxA.") Do If /I "%%~nB"=="debug" %CP%

只有在输入参数arg [0],%1已提供并存在的情况下,此参数才有效。