Удалить пустые каталоги с помощью msbuild

Как я могу обработать путь рекурсивно, чтобы после завершения обработки не было пустых каталогов под этим путем.

Например, скажем, у нас естьC:\Dir1\Dir2\Dir3 и нет файлов в любом из этих каталогов. Результатом должно стать удаление всех трех каталогов.

Я хотел бы сделать это без использования пользовательских задач.

Ответы на вопрос(2)

Exec Задача запуска PowerShell:

MSBuild

<Project DefaultTargets="DefaultTarget" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <CleanPath>C:\MyDirAboveDir1</CleanPath>
    </PropertyGroup>

    <Target Name="DefaultTarget">
        <Exec Command="PowerShell .\RemoveDir.ps1 '$(CleanPath)'" />
    </Target>
</Project>

PowerShell RemoveDir.ps1

Param ([string]$folderpath = $(throw "provide folderpath"))

$folders = Get-ChildItem $folderpath -recurse -force | ? {$_.PSIsContainer}

if ($folders -ne $null)
{
    [array]::Reverse($folders)

    foreach($folder in $folders)
    {
        Write-Host "Examining contents of $($folder.fullname)"
        $childitems = Get-Childitem $folder.fullname -recurse -force | ? { $_.PSIsContainer -eq $false }

        if($childitems -eq $null)
        {
            "Remove folder: " + $folder.FullName
            Remove-Item $folder.FullName -Recurse -Force
        }
        else
        {
            Write-host "Files found in $folder, skipping delete"
        }

        $childitems = $null
    }
}
else
{
    Write-Host "no sub folders found"
}

Courtesy to Guy Ellis Rocks: скрипт Powershell для удаления пустых каталогов

 Jason Kresowaty19 июн. 2012 г., 12:23
Не совсем то, что я искал (получение зависимости от файла вне файла msbuild), но спасибо. Может пригодиться когда-нибудь, так как иногда я использую PowerShell.
Решение Вопроса

не проверять производительность подсчета тысяч файлов, хотя бы просто для получения длины массива ...

<Project DefaultTargets="Foo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Foo">
        <ItemGroup>
            <Directories Include="$([System.IO.Directory]::GetDirectories('D:\foo', '*', System.IO.SearchOption.AllDirectories))" />
            <Directories>
                <Files>$([System.IO.Directory]::GetFiles("%(Directories.Identity)", "*", System.IO.SearchOption.AllDirectories).get_Length())</Files>
            </Directories>
        </ItemGroup>        
        <RemoveDir Directories="@(Directories)" Condition="%(Files)=='0'" />
    </Target>
</Project>
 19 июн. 2012 г., 09:33
Каталог, содержащий каталог, содержащий файлы, не будет удален, поскольку количество файлов для такого каталога с параметром AllDirectories не будет равно 0.
 Jason Kresowaty18 июн. 2012 г., 20:46
Я не думаю, что это правильно. Каталог, содержащий каталог, содержащий файлы, не должен быть удален. См. Точный текст о рекурсии и т. Д. В первой строке OP.
 Jason Kresowaty19 июн. 2012 г., 12:21
Аааа, я не обращал внимания наAllDirectories часть. Несколько неэффективно для глубоко вложенных деревьев, содержащих много файлов глубоко в дереве, но я сомневаюсь, что это обычно будет проблемой на практике. Я нахожу это довольно элегантным, хотя. Спасибо!

Ваш ответ на вопрос