传递给 MsBuild 的 Arg 在 PostBuildEvent 上未被识别

Arg passed to MsBuild not recognized on PostBuildEvent

我有一个要在我的 jenkins 服务器上编译的 csproj 文件,它包含一个构建后事件:

<PostBuildEvent>
    IF NOT DEFINED AAACOPYNEWONLY GOTO :EOF

    IF "%25AAACOPYNEWONLY%25" == "yes" (
        SET NEWOPT=/D
    ) ELSE (
        SET NEWOPT=
        RMDIR /S /Q "$(Outdir)\..\schema"
    )

    XCOPY /E /Y /I /Q %25NEWOPT%25 $(ProjectDir)..\schema "$(Outdir)\..\Schema"
</PostBuildEvent>

当我在 windows 中将 AAACOPYNEWONLY 定义为系统环境变量时,一切正常,schema 文件夹被复制到 ProjectDir 所指的位置。

但是当我在对 msbuild 的调用中直接提供变量时,未创建文件夹:

msbuild MyProject.csproj -t:ReBuild -p:AAACOPYNEWONLY=NO

我也扫描了我的日志文件,但没有任何东西表明 xcopy 甚至 运行,这让我假设条件 IF NOT DEFINED AAACOPYNEWONLY 不匹配。

当变量作为 arg 提供给 msbuild 时,为什么没有适当地传递到事件中?

编辑:我稍微简化了 postbuild,以简单地打印变量的内容:

<PostBuildEvent>
    echo AAACOPYNEWONLY = "%25AAACOPYNEWONLY%25"
</PostBuildEvent>

这只是打印 AAACOPYNEWONLY = "".

您应该在 csproj 文件中以与其他 MSBuild 属性相同的方式定义 属性,例如 ConfigurationPlatform

<PropertyGroup>
...
   <AAACOPYNEWONLY Condition=" '$(AAACOPYNEWONLY)' == '' ">NO</AAACOPYNEWONLY>
...
</PropertyGroup>

然后您就可以将它作为参数传递给 msbuild 命令行,例如-p:AAACOPYNEWONLY=NO-p:AAACOPYNEWONLY=YES