MSBuild创建BAT文件,调用立即删除,如何查看BAT内容?

MSBuild creates BAT file, call it and delete it immediately, how can I see BAT content?

我正在诊断一个 Visual Studio 项目构建问题,我想看看 MSBuild.exe 实际做了什么。但是,从 Procmon 中,我看到 MSBuild 创建了 BAT 文件,调用它并立即删除它,那么我如何才能看到 BAT 的内容?

比如真正的BAT命令隐藏在tmpd60d571fd9d549e5b2b31bb1f2ba51a7.exec.cmd.

里面
"C:\Windows\system32\cmd.exe"  /Q /C C:\Users\win7evn\AppData\Local\Temp\tmpd60d571fd9d549e5b2b31bb1f2ba51a7.exec.cmd

MSBuild.exe 将 cl.exe、link.exe、Prebuild/Postbuild 自定义命令等写入这些临时 bat 文件。具体来说,我想看看 MSBuild 究竟是如何调用我的自定义命令的,以及他是如何从 bat 文件中向我传递参数的。

我认为理想的方法可能是一些工具可以拦截文件删除操作,并对该文件进行备份(复制),以便我们稍后调查“删除”的文件。 Procmon只记录了ReadFile和WriteFile的字节数,没有记录它们的字节内容,所以我觉得Procmon是不够的。

====更新====

根据stijn的回答(env-var MSBUILDPRESERVETOOLTEMPFILES=1),我在VS2019上试了一下成功。 xxx.exec.cmd里面的内容是这样的:

需要注意两点:

  1. 我们不需要传递 /verbosity:d 参数。
  2. 在VS2010上,MSBuild版本可能太旧,没有影响。

最后评论:我认为“看到真实的 .bat 内容”这一功能很重要,因为,我可能会在我的 Custom-build/Prebuild/Postbuild 命令中使用许多宏,例如 $(ProjectDir)$(Configuration),甚至是我自己定义的任何名称的宏,所以我需要宏扩展结果的全局视图,而不是从 VSIDE UI 逐个检查每个宏(这么多鼠标点击和时间消费)。 .bat 内容正是我需要的全局视图。

Msbuid 在 运行 执行 Exec 任务时会创建 .cmd 文件,具体取决于您正在诊断的问题,只知道在这些文件中添加了哪些语句可能就足够了,这可以可在此处找到:https://github.com/dotnet/msbuild/blob/main/src/Tasks/Exec.cs.

否则将 MSBUILDPRESERVETOOLTEMPFILES 环境变量设置为 1,这样文件就不会被删除,然后 运行 和 /v:D 查看创建了哪些文件。