2009-04-29 61 views
7

如果項目列表中的任何文件丟失,我想運行一個任務。我怎麼做?如何使用msbuild檢查項目列表中是否存在任何文件?

我目前的劇本有「源」文件列表@(MyComFiles),我翻譯的「目的地」文件的另一個列表@(MyInteropLibs),使用以下任務:

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

我要檢查如果@(MyInteropLibs)中的任何文件丟失並運行將創建它們的任務。

回答

3

我對MSBuild不是很熟悉,所以可能會有比這更好的解決方案,但是您可以編寫一個FilesExist任務,它接受文件列表並將每個文件傳遞給File.Exists,如果它們存在則返回true,否則返回false,然後返回n反應過來基於結果

對不起,我不能提供代碼助陣,我的MSBuild的語法時才knowlege不強

+0

我寧願在msbuild中做它。可以在任務的條件屬性中使用函數Exists(),但它只能在一個文件上工作。 – 2009-04-29 13:02:21

4

如果你只需要創建丟失的文件,並沒有得到文件列表如果這些文件不存在,那麼你會丟失touch task

<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)"/> 
0

你可以很容易地找到使用Exec。

要測試是否存在一組文件:DOS FOR/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命令接受以分號分隔的文件列表。如果它在列表中找到任何文件,則將%ERRORLEVEL%設置爲0;如果找不到任何文件,則將其設置爲非零。 (這是比較簡單的情況下,但它確實地址原來的問題...)

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

那麼很有可能你會想定義基於輸出端的布爾屬性。

編輯:順便說一句,這是一種代碼味道。通常當你發現自己想要這樣做時,這表明你應該設置目標的Outputs屬性,以便它循環遍歷這些項目。

相關問題