Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio MSBuild在路径名中使用元数据时复制整个目录_Visual Studio_Msbuild_Copy - Fatal编程技术网

Visual studio MSBuild在路径名中使用元数据时复制整个目录

Visual studio MSBuild在路径名中使用元数据时复制整个目录,visual-studio,msbuild,copy,Visual Studio,Msbuild,Copy,以下是我找到的几个类似的答案,但没有一个回答我的问题: 我想做的是: 我需要在编译后将目录树复制到项目中的几个不同位置。 以下是目前的做法: <ItemGroup> <MediaFiles Include="$(ProjectDir)media\**\*.*" /> <DeployLabel Include="$(ProjectDir)deploy\x"> <Dir>x</Dir> <

以下是我找到的几个类似的答案,但没有一个回答我的问题:

我想做的是:

我需要在编译后将目录树复制到项目中的几个不同位置。 以下是目前的做法:

  <ItemGroup>
    <MediaFiles Include="$(ProjectDir)media\**\*.*" />
    <DeployLabel Include="$(ProjectDir)deploy\x">
      <Dir>x</Dir>
    </DeployLabel>
    <DeployLabel Include="$(ProjectDir)deploy\y">
      <Dir>y</Dir>
    </DeployLabel>
    <DeployLabel Include="$(ProjectDir)deploy\z">
      <Dir>z</Dir>
    </DeployLabel>
  </ItemGroup>
  <Target Name="GenericDeploy"
          Inputs="@(DeployLabel)"
          Outputs="%(Identity).Dummy">
    <Message Text="Deploying: @(DeployLabel)" />
    <Copy SourceFiles="@(MediaFiles)"
          DestinationFiles="@(MediaFiles->'$(ProjectDir)deploy%(Dir)media\%(RecursiveDir)%(Filename)%(Extension)')"/>

x
Y
Z
它假装运行,但根本不复制任何内容。我还尝试使用
%(DeployLabel.Dir)
,但这给了我一个错误


我不想使用
xcopy
,因为该程序似乎不在Windows安装的默认清单中(我的电脑没有)。另外,我必须承认,我不完全理解
%
这件事是做什么的。当我一开始看到@和%时,我以为它们是从Make复制的,但现在我开始怀疑。。。另外,了解一下
->
的含义也会有所帮助(很难找到关于这些神秘名称的文档)。

好吧,我确实以某种方式解决了这个问题,但我仍然对回答“额外”问题感兴趣/也许我的解决方案不好:

我在目标中添加了一个
PropertyGroup
,并在那里连接了路径:

<PropertyGroup>
  <Deploydir>$(ProjectDir)deploy\%(DeployLabel.Dir)\media</Deploydir>
</PropertyGroup>

相反,这避免了百分比(可能)来自两个不同位置的问题。

这些批处理非常混乱,因为批处理的某些组合适用于不同的项目组,而有些则不适用。我创建了一个小项目来显示一些差异:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Batch" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
 <ItemGroup>
  <BatchItem Include="myFile.txt">
   <Folder>c:\Temp</Folder>
  </BatchItem>
  <BatchItem Include="myFile2.txt">
   <Folder>c:\Tmp</Folder>
  </BatchItem>

  <DifferentItem Include="myFile3.txt">
   <Folder>c:\diff</Folder>
  </DifferentItem>
 </ItemGroup>

 <Target Name="Batch">
  <Message Text="Using (at) @(BatchItem) --  @(DifferentItem)" />
  <Message Text="Using -> @(BatchItem->'%(Folder)\somethingInbetween\%(Identity)') -- @(DifferentItem->'%(Folder)\somethingInbetween\%(Identity)')" />   
  <Message Text="Using percent %(BatchItem.Folder)\%(BatchItem.Identity) -- %(DifferentItem.Folder)\%(DifferentItem.Identity)" />
 </Target>
</Project>

c:\Temp
c:\Tmp
c:\diff
  • 第一个将只在字符串分号分隔的情况下放置所有后面的项
  • 第二个将使用一个项目的特定元数据来创建一个字符串。这是对所有元素执行的,它们以分号分隔为一个项目
  • 第三个表达式也引用了项的元数据,但它也调用了组中每个项的目标。这样做你不能混合项目组

    使用(at)myFile.txt;myFile2.txt——myFile3.txt

    使用->c:\Temp\somethingbeen\myFile.txt;c:\Tmp\somethingbeen\myFi le2.txt--c:\diff\somethinginebween\myFile3.txt

    使用百分比c:\Temp\myFile.txt--\

    使用百分比c:\Tmp\myFile2.txt--\

    使用百分比\--c:\diff\myFile3.txt


我不记得读过关于这方面的好文档,但批处理和转换应该是正确的名称:对我来说,这是很多“通过尝试学习”;)
<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Batch" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
 <ItemGroup>
  <BatchItem Include="myFile.txt">
   <Folder>c:\Temp</Folder>
  </BatchItem>
  <BatchItem Include="myFile2.txt">
   <Folder>c:\Tmp</Folder>
  </BatchItem>

  <DifferentItem Include="myFile3.txt">
   <Folder>c:\diff</Folder>
  </DifferentItem>
 </ItemGroup>

 <Target Name="Batch">
  <Message Text="Using (at) @(BatchItem) --  @(DifferentItem)" />
  <Message Text="Using -> @(BatchItem->'%(Folder)\somethingInbetween\%(Identity)') -- @(DifferentItem->'%(Folder)\somethingInbetween\%(Identity)')" />   
  <Message Text="Using percent %(BatchItem.Folder)\%(BatchItem.Identity) -- %(DifferentItem.Folder)\%(DifferentItem.Identity)" />
 </Target>
</Project>