如何在Visual Studio 2017发布到文件系统后执行自定义脚本
实现VS2017文件系统发布后自动运行自定义脚本
我刚好折腾过VS2017的这个场景,给你两个实用的方案,都是针对文件系统发布配置的:
方案一:直接修改发布配置文件(最推荐)
VS的发布流程本质是靠MSBuild脚本驱动的,咱们可以直接在已有的.pubxml发布配置里加个触发脚本的任务:
- 打开你的发布配置:右键项目 → 发布 → 点左侧「显示所有设置」→ 找到「配置文件设置」里的「打开发布配置文件」,会打开对应的
.pubxml文件(一般在项目的Properties\PublishProfiles文件夹下)。 - 在文件的
<Project>标签内部,添加上这段MSBuild任务(建议放在文件末尾):
<Target Name="RunPostPublishScript" AfterTargets="GatherFilesToPublish"> <!-- 替换成你的批处理脚本路径 --> <Exec Command="cmd /c "C:\YourScripts\post-publish.bat"" /> <!-- 如果用PowerShell脚本,换成下面这行 --> <!-- <Exec Command="powershell.exe -ExecutionPolicy Bypass -File "C:\YourScripts\post-publish.ps1"" /> --> </Target>
- 关键说明:
AfterTargets="GatherFilesToPublish"确保这个任务是在所有文件都复制到发布目标目录后才执行,完美匹配你的需求。 - 路径里的
"是XML的转义引号,防止路径带空格时出错。
- 保存文件后重新发布试试,发布完成的瞬间脚本就会自动跑起来。
方案二:用项目后期生成事件(适合简单场景)
如果你的脚本逻辑不复杂,也可以用项目的后期生成事件,但要加个判断,避免每次编译都触发脚本:
- 右键项目 → 属性 → 生成事件 → 编辑「后期生成事件命令行」。
- 输入这段命令:
if "$(PublishProfileName)" ne "" ( call "C:\YourScripts\post-publish.bat" )
- 原理:
$(PublishProfileName)是VS发布时才会赋值的环境变量,只有通过发布流程触发的编译,这个变量才有值,普通编译时不会执行脚本。
几个注意点
- 路径尽量用绝对路径,或者用VS内置变量(比如
$(ProjectDir)代表项目根目录,写成$(ProjectDir)Scripts\post-publish.bat更灵活)。 - 如果脚本需要管理员权限,要么右键以管理员身份运行VS,要么在脚本里处理权限请求。
- 测试的时候可以在脚本里加个
echo 发布完成 & pause,或者用VBS弹个提示框,确认脚本确实被触发了。
内容的提问来源于stack exchange,提问作者Niklaus Wirth
相关产品推荐
相关产品推荐

