2012-05-30 2 views
0

빌드 스크립트의 일부로 사용자 메시지 파일을 하위 디렉토리에서 복사하고 하위 디렉토리의 이름을 메시지 파일에 추가하려고합니다. 즉 MSG \ 0 \ message.std> MSG \ message0.std% (RecursiveDir)을 파일 이름의 일부로 사용하는 MSBuild

제가

<Copy SourceFiles="@(MessageFiles)" 
DestinationFiles="@(MessageFiles->'$(BuildRoot)\%(Filename)%(RecursiveDir)%(Extension)'"/> 

그러나 이것은 파일 .. \ message0.std 복사하려고 시도하여

.

어쨌든 % (RecursiveDir)에서 후행 '\'을 (를) 표시하지 않거나 대상 이름을 다른 방법으로 구성 하시겠습니까?

답변

2

당신은 다음과 같이 할 수있다 : 당신은 당신의 일을 유지하기 위해 노력할 것이다 사람의 마음을 날려하고자하는 경우

<Target Name="DoIt"> 
    <ItemGroup> 
     <MessageFiles2 Include="@(MessageFiles)"> 
      <SubDir>$([System.IO.Path]::GetFileName($([System.IO.Path]::GetDirectoryName(%(MessageFiles.RecursiveDir)))))</SubDir> 
     </MessageFiles2> 
    </ItemGroup> 

    <Message Text="@(MessageFiles2->'$(BuildRoot)\%(Filename)%(SubDir)%(Extension)')"/> 

</Target> 

또는 :

<Target Name="DoIt"> 
    <Message Text="@(MessageFiles->'$(BuildRoot)\%(Filename)$([System.IO.Path]::GetFileName($([System.IO.Path]::GetDirectoryName($([System.String]::Copy('%(MessageFiles.RecursiveDir)'))))))%(Extension)')"/> 
</Target> 

이되지 않습니다 완벽한 솔루션이지만 여기에서 시작할 수 있습니다. RecursiveDir이 비어있는 경우 즉, 메시지 파일이 루트 폴더에 직접있는 경우 위의 두 예 모두 중단됩니다.
자세한 내용은 MSBuild Property Functions 블로그 게시물에서 확인할 수 있습니다.

문제를 처리하는 또 다른 방법으로 항상 Custom Task을 만들 수 있습니다.

관련 문제