如何使用条件编译器常量删除 Visual Studio 预构建事件中的目录?

How do I remove directory in Visual Studio pre-build event using conditional compiler constants?

我们有各种 VB.NET 解决方案,这些解决方案都有与之相关联的 ClickOnce 安装程序,但我们不会 require/want 保留以前版本的安装程序。所以我今天所做的是向项目添加预构建事件,删除安装程序的 "Application Files" 文件夹:

rd /s /q "\myserver\myapp\Application Files"

这很好用。

现在我们有另一个解决方案,它使用自定义编译器常量构建(通过 Visual Studio 中的高级编译选项设置)- 如果有一个名为 APP1 的常量,那么它的编译方式与常量 APP2 不同现在,随后我们有一个不同的发布文件夹用于关联的 ClickOnce 安装程序,因此需要删除与当前构建关联的正确 "Application Files" 文件夹。

如果存在 APP1,则 ClickOnce 输出文件夹为“\myserver\app1\Application Files”,同样,如果存在 APP2,则 ClickOnce 输出文件夹为“\myserver\app2\Application Files”。请注意,这些位置是 UNC 设置并以双“\”开头,但出于某种原因未在此 post !

中显示为双精度

所以我一直在研究在我的预构建事件中访问这些编译器常量,我最终得到:

if "$(DefineConstants.Contains(APP1))" (rd /s /q "\myserver\App1\Application Files")

if "$(DefineConstants.Contains(APP2))" (rd /s /q "\myserver\App2\Application Files")

所以如果我将编译器常量设置为 App1 并尝试构建我得到:

Error The command "if "True" (rd /s /q "\myserver\App1\Application Files") if "False" (rd /s /q "\myserver\App2\Application Files")" exited with code 255.

我尝试了各种方法,使用 When/Choose,使用 rmdir 等,但我总是以 255 错误退出;所以有谁知道这是为什么......更重要的是,知道我如何绕过它?

干杯,

克里斯

我创建了一个演示并在我这边重现了您的问题,请像这样修改您的构建前事件:

if $(DefineConstants.Contains(APP1)) == True (rd /s /q "\myserver\App1\Application Files")

if $(DefineConstants.Contains(APP2)) == True  (rd /s /q ""\myserver\App2\Application Files ")