我正在尝试创建一个将作为构建脚本运行的批处理文件。我想将任何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
)
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
为了测试目的,所需的COPY命令仅为ECHO
。 在您确认命令正确后,将ECHO(COPY
更改为COPY
以实际复制文件。附加>nul
以取消报告消息(例如1 file copied
)
我选择从.dll
和M:\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
已提供并存在的情况下,此参数才有效。