我正在尝试创建一个将作为构建脚本运行的批处理文件。 我想将任何 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
)
这将从名为bin
debug
SOME dir NAME debug
MYbin
等的目录中复制所有dll
,但不会从debug dir
bin 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
您需要更改sourcedir
和destdir
的设置以适合您的情况。
所需的 COPY 命令仅用于测试目的ECHO
。验证命令正确后,将ECHO(COPY
更改为COPY
以实际复制文件。附加>nul
以禁止显示报告消息(例如。1 file copied
(
我选择从M:tokyo...bin64
和M: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
提供并存在时,这才应该有效。