MSBuild를 사용하여 항목 목록의 파일이 존재하는지 어떻게 확인합니까?

StackOverflow https://stackoverflow.com/questions/802070

  •  03-07-2019
  •  | 
  •  

문제

항목 목록의 파일이 없으면 작업을 실행하고 싶습니다. 어떻게해야하나요?

내 현재 스크립트는 다음 작업을 사용하여 "대상"파일 @(myinteroplibs)의 다른 목록을 번역하는 "소스"파일 @(mycomfiles) 목록이 있습니다.

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

@(myinteroplibs)의 파일이 누락되었는지 확인하고이를 생성 할 작업을 실행하고 싶습니다.

도움이 되었습니까?

해결책

MSBuild에 대해서는 경험이 많지 않으므로이보다 더 나은 솔루션이있을 수 있지만 파일 목록을 가져 와서 각 파일을 파일로 전달하는 filESexist 작업을 작성할 수 있습니다. 결과

도와 드릴 코드를 제공 할 수 없어서 미안합니다. MSBuild sytax에 대한 나의 지식은 강하지 않습니다.

다른 팁

누락 된 파일 만 만들 필요가 있고 누락 된 파일 목록을 얻지 못하면 터치 작업, 파일이 존재하지 않으면 생성됩니다.

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

누락 된 파일 만 만들고 기존 파일의 타임 스탬프를 변경하지 않으려면 배치가 도움이 될 수 있습니다.

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

생성 된 파일 목록을 원한다면

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

exec를 사용하여 쉽게 찾을 수 있습니다.

모든 파일 세트가 존재하는지 테스트하기 위해 : /d 명령은 세미콜론으로 구분 된 파일 목록, 즉 평평한 항목 배열을 허용합니다.

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

파일 세트가 존재하는지 테스트하려면 DOS DIR 명령은 세미콜론으로 구분 된 파일 목록을 수락합니다. 목록에서 파일을 찾으면 비율이 0으로 설정됩니다. (이것은 더 간단한 경우이지만 ~ 아니다 원래 질문을 해결하십시오 ...)

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

그런 다음 대부분 출력에 따라 부울 속성을 정의하고 싶을 것입니다.

편집하다: btw 이것은 코드 냄새입니다. 일반적으로 자신 이이 작업을 수행하고 싶을 때는 대상의 출력 속성을 설정하여 항목을 통해 반복해야한다는 표시입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top