VS生成后事件及相关bat命令解析

您所在的位置:网站首页 新建空白文件的快捷键命令是 VS生成后事件及相关bat命令解析

VS生成后事件及相关bat命令解析

2023-08-04 09:31| 来源: 网络整理| 查看: 265

1 简介

在VS进行项目开发时,开发人员可能会开发出dll,也可能会开发出exe可执行文件,在开发机开发出来的可执行程序在复制到服务器之前,需要把相关的dll、pdb,可执行文件,批处理文件和配置文件组织在一起,打包安装在服务器,但是程序可能仅生成一个dll和pdb,但其他的文件需要引用公共库中提供的dll,这时就会有许多的手动复制的工作,由于持续集成CI的概念的作用,最好的情况是只在一处维持公共库,在需要升级时,仅更换公共库中的DLL和PDB等文件,重新编译程序,把手动拷贝需要的DLL、pdb文件的过程自动化,保持升级的质量。生成后事件就是在这样的需求之下提出的。

2 生成事件 2.1 概念

在一个解决方案中有多个项目的时候,我们常需要拷贝一些文件,dll到指定的目录下,或者遇到com组件还需要提前注册dll,这个就需要用到VS的生成事件。中。 仅当生成在生成过程中成功到达这些点时,生通过指定自定义生成事件,可以在生成开始之前或在它完成之后自动运行命令。 例如,可以在生成开始之前运行 .bat 文件,或是在生成完成之后将新文件复制到文件夹成事件才会运行。 Visual Studio在生成项目工程前后,有时我们需要做一些特殊的操作,比如:拷贝生成的dll到指定目标下面等。 结合VS可以添加预先生成事件和后期生成事件,采用命令或bat批处理。

2.2 如何在VS中使用生成事件

在VS中使用生成事件非常方便,可以按照如下流程进行处理,按照如下的命令在指定的位置填入命令或者文件名即可。

2.2.1 流程

打开项目,右击项目,打开属性—>配置属性–>生成事件,如图所示: 这里写图片描述

2.2.2 直接填入命令

可以在命令行中直接填入copy,xcopy等DOS文件复制命令。如同下图所示: 这里写图片描述 可以在拷贝命令行中看到诸如TargetPath, ProjectDir, ProjectName, TargetDir。而具体这些变量的值可以在点击宏之后弹出的框中查找具体含义: 这里写图片描述 点击宏,在英文模式下输入p即可快速找到p开头的宏定义。在此把这里经常使用的变量以及对应值附录如下:

宏值TargetPathD:\Git\004_c_components\Devices\src\Release\HikNetSdkClientPlugin.dllTargetDirD:\Git\004_c_components\Devices\src\Release\ProjectDirD:\Git\004_c_components\Devices\src\HikNetSdkClientPlugin\ProjectNameHikNetSdkClientPlugin.dllSolutionDirD:\Git\004_c_components\Devices\src\

而第一个命令行

copy $(TargetPath) $(ProjectDir)..\..\$(ProjectName)\

则是通过copy命令进行文件的拷贝。TargetPath表示的是HikNetSdkClientPlugin项目生成的DLL文件,第二个参数的形式比较奇怪,首先$(ProjectDir)的路径位置在上表可以查到,内容为:

D:\Git\004_c_components\Devices\src\HikNetSdkClientPlugin\

而..表示当前目录的上一层目录,因此两个..表示$(ProjectDir)的上两层目录,即

D:\Git\004_c_components\Devices

再接上随后的$(ProjectName)\,最终的目标位置为:

D:\Git\004_c_components\Devices\HikNetSdkClientPlugin\

里面涉及的是文本替换,就是使用现有的宏重新组合成目标位置。 这里写图片描述 而xcopy命令所执行的功能与copy比较相似,xcopy完成复制文件和目录树,不在此赘述。

2.2.3 批处理文件

如果需要的生成事件涉及比较复杂的删除目录,删除文件,拷贝目录,拷贝子目录,等操作,可能需要撰写比较多的命令,为了简化,可以把这些拷贝,删除动作组织成一个bat文件,如下图所示: 这里写图片描述 而该文件的内容由之前的copy类似的命令组成,内容如下:

::清除旧文件 del /S /Q "%~dp0"Bin\*.dll del /S /Q "%~dp0"Bin\*.dll rd /S /Q "%~dp0"Bin\hplugin rd /S /Q "%~dp0"Bin\hplugin ::公共DLL xcopy /Y "%~dp0"..\dll\HLOG.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\hpr.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\Identify.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\libeay32.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\RegexInterface.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\EncryptInterface.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\hplug.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\RemoteDeviceSocket.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\CrashAPI.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\HLOG.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\hpr.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\Identify.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\libeay32.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\RegexInterface.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\EncryptInterface.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\hplug.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\RemoteDeviceSocket.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\CrashAPI.dll "%~dp0"Bin\ ::开源协议 ::主程序 xcopy /Y "%~dp0"Release\DeviceInterfaceAgent.exe "%~dp0"Bin\ ::脚本 xcopy /Y "%~dp0"Release\*.bat "%~dp0"Bin\ ::插件 rd /S /Q "%~dp0"Release\hplugin rd /S /Q "%~dp0"Release\hplugin md "%~dp0"Release\hplugin md "%~dp0"Bin\hplugin xcopy /Y /S "%~dp0"..\Devices\* "%~dp0"Release\hplugin\ /EXCLUDE:%~dp0\HpluginExclude.txt xcopy /Y /S "%~dp0"Release\hplugin\* "%~dp0"Bin\hplugin\ /EXCLUDE:%~dp0\PdbExclude.txt ::保存PDB rd /S /Q "%~dp0"PDB rd /S /Q "%~dp0"PDB md "%~dp0"PDB xcopy /Y /S "%~dp0"Release\*.pdb "%~dp0"PDB\

%~dp0 是盘符加路径,即该CopyBuildFile.bat文件所在的目录

D:\Git\004_c_components\DeviceAccess

加入的文件执行的功能与直接填入命令功能一致,并没有什么区别。

2.3 注意事项

这里有两点注意: 1、目标路径要用双引号括起来 2、使用了宏的源不需要,比如可以写成$(TargetDir)*.exe 3、如果项目无任何改动,“生成”是不会编译的,所以当运行生成后事件选中“生成更新项目输出时”,不会被执行,但“重新生成”会无条件的输出,并触发事件

3 批处理文件bat命令

在生成事件中,常涉及的命令有文件的拷贝或者删除,目录的创建和删除,因此在这种情景下,需要弄清楚如下的命令。

3.1 del

C:\Windows\SysWOW64>del /? 删除一个或数个文件。 DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names names 指定一个或多个文件或者目录列表。 通配符可用来删除多个文件。 如果指定了一个目录,该目录中的所 有文件都会被删除。 /P 删除每一个文件之前提示确认。 /F 强制删除只读文件。 /S 删除所有子目录中的指定的文件。 /Q 安静模式。删除全局通配符时,不要求确认 /A 根据属性选择要删除的文件 属性 R 只读文件 S 系统文件 H 隐藏文件 A 存档文件 I 无内容索引文件 L 重分析点 - 表示“否”的前缀 如果命令扩展被启用,DEL 和 ERASE 更改如下: /S 开关的显示句法会颠倒,即只显示已经 删除的文件,而不显示找不到的文件。

3.2 copy

C:\Windows\SysWOW64>copy /? 将一份或多份文件复制到另一个位置。 COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/L] [/A | /B ] source [/A | /B] [+ source [/A | /B] [+ ...]] [destination [/A | /B]] source 指定要复制的文件。 /A 表示一个 ASCII 文本文件。 /B 表示一个二进位文件。 /D 允许解密要创建的目标文件 destination 为新文件指定目录和/或文件名。 /V 验证新文件写入是否正确。 /N 复制带有非 8dot3 名称的文件时, 尽可能使用短文件名。 /Y 不使用确认是否要覆盖现有目标文件 的提示。 /-Y 使用确认是否要覆盖现有目标文件 的提示。 /Z 用可重新启动模式复制已联网的文件。 /L 如果源是符号链接,请将链接复制 到目标而不是源链接指向的实际文件。 命令行开关 /Y 可以在 COPYCMD 环境变量中预先设定。 这可能会被命令行上的 /-Y 替代。除非 COPY 命令是在一个批处理脚本中执行的,默认值应为 在覆盖时进行提示。 要附加文件,请为目标指定一个文件,为源指定 数个文件(用通配符或 file1+file2+file3 格式)。 C:\Windows\SysWOW64>

3.3 xcopy

C:\Windows\SysWOW64>xcopy /? 复制文件和目录树。 XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W] [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U] [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/B] [/EXCLUDE:file1[+file2][+file3]...] source 指定要复制的文件。 destination 指定新文件的位置和/或名称。 /A 仅复制有存档属性集的文件,但不更改属性。 /M 仅复制有存档属性集的文件,并关闭存档属性。 /D:m-d-y 复制在指定日期或指定日期以后更改的文件。 如果没有提供日期,只复制那些源时间比目标时间新的文件。 /EXCLUDE:file1[+file2][+file3]... 指定含有字符串的文件列表。每个字符串在文件中应位于单独的一行。 如果任何字符串与复制文件的绝对路径的任何部分相符,则排除复制 该文件。例如,指定如 \obj\ 或 .obj 的字符串会分别排除目录 obj 下面的所有文件或带有 .obj 扩展名的所有文件。 /P 创建每个目标文件之前提示您。 /S 复制目录和子目录,不包括空目录。 /E 复制目录和子目录,包括空目录。与 /S /E 相同。可以用来修改 /T。 /V 验证每个新文件的大小。 /W 提示您在复制前按键。 /C 即使有错误,也继续复制。 /I 如果目标不存在,且要复制多个文件,则假定目标必须是目录。 /Q 复制时不显示文件名。 /F 复制时显示完整的源文件名和目标文件名。 /L 显示要复制的文件。 /G 允许将加密文件复制到不支持加密的目标。 /H 也复制隐藏文件和系统文件。 /R 覆盖只读文件。 /T 创建目录结构,但不复制文件。不包括空目录或子目录。/T /E 包括 空目录和子目录。 /U 只复制已经存在于目标中的文件。 /K 复制属性。一般的 Xcopy 会重设只读属性。 /N 用生成的短名称复制。 /O 复制文件所有权和 ACL 信息。 /X 复制文件审核设置(隐含 /O)。 /Y 取消提示以确认要覆盖现有目标文件。 /-Y 要提示以确认要覆盖现有目标文件。 /Z 在可重新启动模式下复制网络文件。 /B 复制符号链接本身与链接目标相对。 /J 复制时不使用缓冲的 I/O。推荐复制大文件时使用。 开关 /Y 可以预先在 COPYCMD 环境变量中设置。 这可能被命令行上的 /-Y 覆盖。

3.3.1 /EXCLUDE

xcopy /Y /S "%~dp0"..\Devices\* "%~dp0"Release\hplugin\ /EXCLUDE:%~dp0\HpluginExclude.txt

可以看到这是一个比较特殊的xcopy命令,

"%~dp0"..\Devices\*

指的是该批处理文件所在目录的上一层目录下Devices,即如下目录:

D:\Git\004_c_components\Devices

该目录下有如下内容:

C:\>cd D: d:\ /* 摘要:在日常工作中,经常用到一些脚本化的处理,不可避免有时用到批处理bat脚本。在使用过程中发现,批处理的目录切换,跨盘符时,会切换失败。 失败:如当前目录为C:\Windows,需要切换到D:\Git\,结果目录切换失败,还是处于原目录中。 成功:先输入 D: , 再切换, cd D:\Git\ ,则成功。 */ C:\>D: d:\>cd D:\Git\004_c_components\Devices D:\Git\004_c_components\Devices>dir 驱动器 D 中的卷没有标签。 卷的序列号是 E02B-B916 D:\Git\004_c_components\Devices 的目录 2018/06/05 17:34 . 2018/06/05 17:34 .. 2018/06/05 17:31 BurnDevices 2018/06/14 22:35 HikNetSdkClientPlugin 2018/06/14 22:28 HikTalkClientPlugin 2018/06/05 18:30 src 2018/06/05 17:34 StreamDevices 0 个文件 0 字节 7 个目录 249,013,129,216 可用字节

可以看到,Devices目录下一共有5个目录,包括BurnDevices,HikNetSdkClientPlugin,HikTalkClientPlugin,src,StreamDevices等目录。而这5个目录中,我们要复制的是HikNetSdkClientPlugin,因此,我们在命令中使用了 /EXCLUDE:%~dp0\HpluginExclude.txt 而HpluginExclude.txt的内容如下:

src BurnDevices StreamDevices

正好过滤了三个文件夹。

3.3.2 通配符

xcopy /Y /S "%~dp0"Release\*.pdb "%~dp0"PDB\

上述的代码片段,使用了通配符,作用是拷贝Relase目录下所有的pdb文件到新的PDB目录下。

3.4 rd

D:\Git\004_c_components\Devices>rd /? 删除一个目录。 RMDIR [/S] [/Q] [drive:]path RD [/S] [/Q] [drive:]path /S 除目录本身外,还将删除指定目录下的所有子目录和 文件。用于删除目录树。 /Q 安静模式,带 /S 删除目录树时不要求确认

3.5 md

D:\Git\004_c_components\Devices>md /? 创建目录。 MKDIR [drive:]path MD [drive:]path 如果命令扩展被启用,MKDIR 会如下改变: 如果需要,MKDIR 会在路径中创建中级目录。例如: 假设 \a 不 存在,那么: mkdir \a\b\c\d 与: mkdir \a chdir \a mkdir b chdir b mkdir c chdir c mkdir d 相同。如果扩展被停用,则需要键入 mkdir \a\b\c\d。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3