C# 如何在生成后事件中使用用户定义的变量?

C# 如何在生成后事件中使用用户定义的变量?,c#,variables,msbuild,post-build-event,C#,Variables,Msbuild,Post Build Event,我想在内部使用局部变量,但我不明白如何在内部使用它。此处我的生成后事件命令(param是可通过msbuild/p开关传递的命名参数): 构建解决方案时,我得到: msbuild PrePostBuildEvents.sln /p:param=ext ... PostBuildEvent: set fold=G:\prj\work\PrePostBuildEvents\bin\Debug\ if defined param (set fold=G:\prj\work\PrePostBu

我想在内部使用局部变量,但我不明白如何在内部使用它。此处我的生成后事件命令(
param
是可通过msbuild/p开关传递的命名参数):

构建解决方案时,我得到:

msbuild PrePostBuildEvents.sln /p:param=ext

...

PostBuildEvent:
  set fold=G:\prj\work\PrePostBuildEvents\bin\Debug\
  if defined param (set fold=G:\prj\work\PrePostBuildEvents\bin\Debug\ext\)
  if not exist "%fold%" md "%fold%"
  copy /y "G:\prj\work\PrePostBuildEvents\bin\Debug\PrePostBuildEvents.dll" "%fold%"
  The file cannot be copied onto itself.
          0 file(s) copied.
如果我将
%fold%
更改为
$(fold)
,我会得到另一个结果,但它也是错误的:

PostBuildEvent:
  set fold=G:\prj\work\PrePostBuildEvents\bin\Debug\
  if defined param (set fold=G:\prj\work\PrePostBuildEvents\bin\Debug\ext\)
  if not exist "" md ""
  copy /y "G:\prj\work\PrePostBuildEvents\bin\Debug\PrePostBuildEvents.dll" ""
  The filename, directory name, or volume label syntax is incorrect.
          0 file(s) copied.

我做错了什么?

首先,使用AfterBuild msbuild目标,而不是PostBuild事件。这将为msbuild提供有关您正在尝试执行的操作的更多信息,正确执行应该意味着更快的增量编译

环境变量可用于后生成事件:


理想情况下,一旦您运行了一次msbuild,当您第二次运行它时,由于文件已经存在,它应该不会跳过编译,也不会费心复制任何东西。

我不在我的Windows计算机附近,但在VS中,项目属性中有一个资源选项卡,我想您可以在那里定义它。你可以检查,或者等我靠近Win Machine时我会检查。我假设我只能在那里定义一个常量字符串,但我需要一个可计算的字符串,这取决于命名参数。
PostBuildEvent:
  set fold=G:\prj\work\PrePostBuildEvents\bin\Debug\
  if defined param (set fold=G:\prj\work\PrePostBuildEvents\bin\Debug\ext\)
  if not exist "" md ""
  copy /y "G:\prj\work\PrePostBuildEvents\bin\Debug\PrePostBuildEvents.dll" ""
  The filename, directory name, or volume label syntax is incorrect.
          0 file(s) copied.