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



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

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

你需要delayedexpansion这个,因为我们在代码块( )set

变量通常我们只是告诉它,如果文件夹的最后 3 个字符= bin或最后 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
)

这将从名为bindebugSOME dir NAME debugMYbin等的目录中复制所有dll,但不会从debug dirbin dir等复制。

编辑

在您发表评论后,这应该可以:

@echo off
setlocal enabledelayedexpansion
for /D /R "D:mysolution" %%F in (*) DO (
set "var=%%F"
if /i "!var:~-9!"=="bindebug" copy "!var!*.dll" %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(

我选择从M:tokyo...bin64M:tokyo...bin目录中选择.dll文件,以便于测试。

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

将 %%a +.的文字(驱动器+路径(分配给%%t,生成直接父目录名作为"文件名",并与区分大小写 (/i( 将"文件名"依次与每个所需字符串进行比较。这确保了比较整个父目录名,因此我们不会对像not_this_directory_even_though_its_a_bin这样的名称产生错误命中。

您也可以使用另一个for循环和~修饰符来确定父目录的名称,然后让我们检查部分路径bindebug

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

基于您现在验证的意图,即以bindebug结尾的树,这会预过滤目录递归结果,然后在运行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 (bind?bug) Do For %%B In ("%%~nxA.") Do If /I "%%~nB"=="debug" %CP%

仅当您的输入 arg[0],%1提供并存在时,这才应该有效。

最新更新