2009-04-29 2 views
7

항목 목록의 파일이 누락 된 경우 작업을 실행하고 싶습니다. 어떻게해야합니까?msbuild를 사용하여 항목 목록의 파일이 있는지 어떻게 확인합니까?

내 현재 스크립트는 "소스"파일 목록을 가지고 @ 나는 "대상"파일의 또 다른 목록을 번역하는 것을 (MyComFiles) @ (MyInteropLibs), 다음 작업 사용 :

<CombinePath BasePath="$(MyPath)\interop" 
      Paths="@(MyComFiles->'%(filename).%(extension)')"> 
    <Output TaskParameter="CombinedPaths" 
      ItemName="MyInteropLibs" /> 
</CombinePath> 

내가 확인 할을 @ (MyInteropLibs)에있는 파일 중 누락 된 파일이 있으면 해당 파일을 생성 할 작업을 실행하십시오.

답변

3

MSBuild에 익숙하지 않아서 이보다 더 좋은 해결책이있을 수 있지만 FileList 작업을 작성하여 파일 목록을 가져와 각 파일을 File.Exists에 전달하고 파일이 존재하면 true를 반환하고 그렇지 않으면 false로 반환합니다. 만 얻을 수있는 파일의 목록이 누락 된 파일을 생성, 그리고해야 할 경우 결과에 따라 반응하는 것은, MSBuild에서의 sytax의 나의 knowlege은

+0

나는 msbuild에서 이것을하고 싶습니다. 작업의 Conditional 속성에서 Exists() 함수를 사용할 수는 있지만 한 파일에서만 작동합니다. –

+2

MSBuild에 내장 된 기능이 표시되지 않습니다. MSBuild Extension Pack 또는 MSBuild Community Tasks에서 이러한 기능을 볼 수 없습니다. Crippledsmurf가 제안했듯이 필요한 작업을 수행 할 사용자 지정 MSBuild 작업을 직접 만들 수 있습니다. 그런 다음 빌드 파일에서 dll을 참조하고 필요에 따라 태스크를 호출하십시오. – Pedro

4

강한 내가 도와 코드를 제공 할 수

미안하지

파일이없는 경우 생성하는 touch task을 찾을 수 없습니다. 당신은 단지 누락 된 파일을 만들고, 기존 파일의 타임 스탬프를 변경하는 것을 방지하려는 경우

다음 생성 된 파일의 목록을 원한다면, 일괄 처리가

<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True" 
     Condition=" ! Exists(%(MyInteropLibs.FullPath)) "/> 

을 도울 수

<Touch Files="@(MyInteropLibs)" AlwaysCreate="True" /> 

<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True" 
     Condition=" ! Exists(%(MyInteropLibs.FullPath)) "> 
    <Output TaskParameter="TouchedFiles" ItemName="CreatedFiles"/> 
</Touch> 
<Message Text="Created files = @(CreatedFiles)"/> 
0

Exec를 사용하면 쉽게 찾을 수 있습니다.

모든 파일 집합이 존재하는지 테스트하려면 : DOS FOR/D 명령은 세미콜론으로 구분 된 파일 목록, 즉 병합 된 항목 배열을 허용합니다. 도스 DIR 명령은 파일의 세미콜론으로 구분 된 목록을 허용 : 파일 집합의 모든 존재하는 경우

<!-- All exist --> 
<Exec 
    Command="for /D %%i in (@(MyFiles)) do if not exist %%i exit 1" 
    IgnoreExitCode="true"> 
    <Output TaskParameter="ExitCode" PropertyName="ExistExitCode"/> 
</Exec> 

테스트합니다. 목록에 파일이 있으면 % ERRORLEVEL %를 0으로 설정하고 찾지 못하면 0이 아닌 값을 설정합니다. 그런 다음 출력에 따라 부울 속성을 정의하는 것이 좋습니다 대부분

<!-- Any exists --> 
<Exec Command="dir /B @(MyFiles)" IgnoreExitCode="true"> 
    <Output TaskParameter="ExitCode" PropertyName="DirExitCode"/> 
</Exec> 

(...이 간단한 경우이지만, 하지 주소 원래의 질문 않습니다).

편집 : 이것은 코드 냄새입니다. 일반적으로이 작업을 원할 때 대상의 Outputs 속성을 설정하여 항목을 반복하도록 지정해야한다는 의미입니다.

관련 문제