MSBuild를 사용하여 항목 목록의 파일이 존재하는지 어떻게 확인합니까?
-
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 이것은 코드 냄새입니다. 일반적으로 자신 이이 작업을 수행하고 싶을 때는 대상의 출력 속성을 설정하여 항목을 통해 반복해야한다는 표시입니다.