使用批处理命令转移dll文件

 

引用同一个解决方案中的项目dll或者NuGet安装的dll时,需要实时更新dll,但dll只能自动复制到软件启动目录。
可以使用生成后事件命令行来转移dll文件,如下图:

 

直接使用批处理命令转移dll文件,仍然以VSDebug为例,如下所示:

>以下为使用指定路径和工程名的方式

复制代码
::@echo off
::设置相关路径
set TargetDir=D:\软件代码\代码调试\VSDebug\VSDebug\bin\Debug\
set ProjectName=VSDebug

::检查Lib、Dll文件夹路径是否存在
IF NOT EXIST "%TargetDir%Lib" MD "%TargetDir%Lib"
IF NOT EXIST "%TargetDir%Dll" MD "%TargetDir%Dll"

::设置需要放到Lib路径下的dll
setlocal enabledelayedexpansion 
::以Newtonsoft.Json.dll为例
set Libs[1]=Newtonsoft.Json
set length=1

::转移指定dll文件到Lib文件夹
for /l %%n in (1,1,%length%) do (
echo  转移 !Libs[%%n]! 相关文件
move  "%TargetDir%!Libs[%%n]!.dll"  "%TargetDir%Lib"
move  "%TargetDir%!Libs[%%n]!.xml"  "%TargetDir%Lib"
move  "%TargetDir%!Libs[%%n]!.pdb"  "%TargetDir%Lib"
)

::没有指定的dll放到Dll文件夹
move  "%TargetDir%*.dll"  "%TargetDir%Dll"
move  "%TargetDir%*.xml"  "%TargetDir%Dll"
move  "%TargetDir%*.pdb"  "%TargetDir%Dll"

::把主程序的相关的文件转出来
move  "%TargetDir%Dll\%ProjectName%.xml" "%TargetDir%%ProjectName%.xml"  
move  "%TargetDir%Dll\%ProjectName%.pdb" "%TargetDir%%ProjectName%.pdb"

::pause
复制代码

 

>以下为使用宏变量自匹配的方式 

复制代码
::@echo off
::检查Lib、Dll文件夹路径是否存在
IF NOT EXIST "$(TargetDir)Lib" MD "$(TargetDir)Lib"
IF NOT EXIST "$(TargetDir)Dll" MD "$(TargetDir)Dll"

::设置需要放到Lib路径下的dll
setlocal enabledelayedexpansion 
::以Newtonsoft.Json.dll为例
set Libs[1]=Newtonsoft.Json
set length=1

::转移指定dll文件到Lib文件夹
for /l %%n in (1,1,%length%) do (
echo  转移 !Libs[%%n]! 相关文件
move  "$(TargetDir)!Libs[%%n]!.dll"  "$(TargetDir)Lib"
move  "$(TargetDir)!Libs[%%n]!.xml"  "$(TargetDir)Lib"
move  "$(TargetDir)!Libs[%%n]!.pdb"  "$(TargetDir)Lib"
)

::没有指定的dll放到Dll文件夹
move  "$(TargetDir)*.dll"  "$(TargetDir)Dll"
move  "$(TargetDir)*.xml"  "$(TargetDir)Dll"
move  "$(TargetDir)*.pdb"  "$(TargetDir)Dll"

::把主程序的相关的文件转出来
move  "$(TargetDir)Dll\$(ProjectName).xml" "$(TargetDir)$(ProjectName).xml"  
move  "$(TargetDir)Dll\$(ProjectName).pdb" "$(TargetDir)$(ProjectName).pdb"

::pause
复制代码

 @echo off 和pause组合使用的作用是在以bat文件运行完成后不关闭cmd,这里我们是以命令行直接加在生成后事件中的,

所以这里没有用到此组命令,故进行注释不使用

 

 当运行命令过多时,直接添加命令太过繁琐且不美观,这时可以将所需执行的命令编辑为bat文件,在生成事件中直接调用bat

如下图:

 

 

宏说明(可以通过点击编辑后期生成->宏,查看各项具体值)

点击宏

 

 

$(ConfigurationName) 当前项目配置的名称(例如,“Debug|Any CPU”)。

$(OutDir) 输出文件目录的路径,相对于项目目录。这解析为“输出目录”属性的值。它包括尾部的反斜杠“\”。

$(DevEnvDir) Visual Studio的安装目录(定义为驱动器 + 路径);包括尾部的反斜杠“\”。

$(PlatformName) 当前目标平台的名称。例如“AnyCPU”。

$(ProjectDir) 项目的目录(定义为驱动器 + 路径);包括尾部的反斜杠“\”。

$(ProjectPath) 项目的绝对路径名(定义为驱动器 + 路径 + 基本名称 + 文件扩展名)。

$(ProjectName) 项目的基本名称。

$(ProjectFileName) 项目的文件名(定义为基本名称 + 文件扩展名)。

$(ProjectExt) 项目的文件扩展名。它在文件扩展名的前面包括“.”。

$(SolutionDir) 解决方案的目录(定义为驱动器 + 路径);包括尾部的反斜杠“\”。

$(SolutionPath) 解决方案的绝对路径名(定义为驱动器 + 路径 + 基本名称 + 文件扩展名)。

$(SolutionName) 解决方案的基本名称。

$(SolutionFileName) 解决方案的文件名(定义为基本名称 + 文件扩展名)。

$(SolutionExt) 解决方案的文件扩展名。它在文件扩展名的前面包括“.”。

$(TargetDir) 生成的主输出文件的目录(定义为驱动器 + 路径)。它包括尾部的反斜杠“\”。

$(TargetPath) 生成的主输出文件的绝对路径名(定义为驱动器 + 路径 + 基本名称 + 文件扩展名)。

$(TargetName) 生成的主输出文件的基本名称。

$(TargetFileName) 生成的主输出文件的文件名(定义为基本名称 + 文件扩展名)。

$(TargetExt) 生成的主输出文件的文件扩展名。它在文件扩展名的前面包括“.”。

posted @   感冒药啊  阅读(301)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示