web-dev-qa-db-ja.com

ファイルを削除するためのMSBuildタスクの構文

実動ビルドスクリプトのbinフォルダーからObjディレクトリーとPDBを削除するMSBuildタスクを作成しようとしていますが、正しく動作しないようです。

誰かがこれを行うか類似した例、またはMSBuildでファイルとディレクトリを削除する簡単な例へのリンクを持っていますか?

69
Chris Marisic

ディレクトリ全体を削除する場合は、 RemoveDir タスクが必要です。

<RemoveDir Directories="Path/To/Obj" />

また、binからPDBファイルを削除する場合は、 Delete タスクが必要です。

<Delete Files="Path/To/Bin/MyApp.pdb" />

削除タスクではワイルドカードを使用できないため、複数のpdbファイルがある場合は、引数として ItemGroup を指定する必要があります。

90
Gavin Miller

これらのディレクトリ内のファイルを最初に削除し、次にディレクトリ自体を削除できます

<Target Name="SomeTarget">
    <ItemGroup>
        <FilesToDelete Include="Path\To\Obj\**\*"/>
    </ItemGroup>   
    <Delete Files="@(FilesToDelete)" />   
    <RemoveDir Directories="Path\To\Obj\" />
</Target>
120

私が抱えていたのと同じ問題にぶつかったかもしれない他の人のために投稿する。

削除タスクは読み取り専用ファイルを削除できません。MSBuildがTFSから最新の情報を取得すると、ファイルは読み取り専用としてマークされるため、読み取り専用ファイルを削除する必要がありました。 EXECコマンドを使用して読み取り専用ファイルを削除しました。

<ItemGroup>
    <FileToDelete Include="c:\temp\fileToDelete.txt"/>
</ItemGroup>
<Exec Command="del /F /Q &quot;@(FileToDelete)&quot;"/>
17
Garry English

投稿された回答は、単一のディレクトリを処理する必要がある限り機能します。フォルダーがネストされている場合、RemoveDirDirectory not emptyエラーで失敗します。

少し一般的なアプローチも、ネストされたフォルダーを処理します。

<Target Name="CleanOutDir">
    <ItemGroup>
        <FilesToClean Include="$(OutDir)\**\*.*" />

        <!-- Bit of .Net to get all folders and subfolders -->
        <FoldersToClean Include="$([System.IO.Directory]::GetDirectories(&quot;$(OutDir)&quot;))" />
    </ItemGroup>

    <Delete Files="@(FilesToClean)"/>
    <RemoveDir Directories="@(FoldersToClean)" />
</Target>
7
Mrchief

このコードは非常にいため、飛行機酔い袋が付属しています。 ;-)しかし、削除するファイルのリストなどを作成しないため、高速です。

<Target Name="DeleteBuildFolder">
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
</Target>

いくつのRmDirコマンドが必要ですか?十分な数のRmDirコマンドが、「ディレクトリが空ではありません」ではなく、「指定されたファイルが見つかりません」を返します。私のマシンでは、Windowsエクスプローラーで$(BuildFolder)が開いている場合、別のRmDirを使用するようです。アンチウイルスプログラムはRmDirに影響する場合がありますが、ときどきSubversionを実行しますが、除外リストを(誤って)管理するよりも、包括的なAV保護が必要です。

5
Mark Jerde

最初にファイルから読み取り専用プロパティを削除し、msbuild deleteタスクを実行することもできます。

そのようです:

<Target Name="DeleteFiles">
 <Message Text="Delete File" Importance="high"/>
 <Attrib Files="$(FileToDelete)" ReadOnly="false" />
 <Delete Files="$(FileToDelete)" />
</Target>`
4
Ole

Visual Studio 2013では、これを.csprojファイルの</Project>終了タグの直前に追加しました

<Target Name = "clean_folders" AfterTargets="Clean">
 <Exec Command = "rd /S /Q obj" />
 <Exec Command = "rd /S /Q bin" />
</Target>

最初は動作していないように見えましたが、Visual Studio(またはR#、不明)がDesignTimeResolveAssemblyReferencesInput.cacheをobjフォルダーに再追加し、現在の\binも再追加したことに気付きました。フォルダー(\binの下の異なるサブフォルダーに異なるビルドがあります)。インポートされた.csprojファイルから私が持っている他の25のビルド構成を含む、他のすべてを削除しました(はい、私は知っています)。

複数の設定を一括再構築する場合は、各再構築の以前のすべての作業が消去されるため、最後の設定のみが残されるので注意してください。ふむ。

2
CAD bloke

私が発見したもう1つのしわを追加するだけです。私はVisual Studio 2015を使用しています。ワイルドカードを使用して削除する投稿された回答は、まだ面倒です。 ワイルドカードはビルド後ではなくビルド前に評価されると思われます。つまり、削除するファイルがビルド中に作成された場合、削除は行われません。また、ビルドするたびに削除が機能するというすばらしい動作につながります。これにより、テストが非常に楽しくなります。

ワイルドカードをあきらめています。私がやっていることについて、私は問題を引き起こしているファイルを知っており、実際のファイル名をハードコーディングしています(プロジェクトファイル内で呼び出すことができる場合)。

1
rrreee