使用msbuild删除空目录

使用msbuild删除空目录,msbuild,Msbuild,如何递归地处理路径,以便在处理完成后,路径下没有空目录 例如,假设我们有C:\Dir1\Dir2\Dir3,并且这些目录中没有任何文件。结果应该是删除所有三个目录 我希望在不使用自定义任务的情况下完成此任务。使用运行PowerShell的Exec任务: MSBuild <Project DefaultTargets="DefaultTarget" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <

如何递归地处理路径,以便在处理完成后,路径下没有空目录

例如,假设我们有
C:\Dir1\Dir2\Dir3
,并且这些目录中没有任何文件。结果应该是删除所有三个目录


我希望在不使用自定义任务的情况下完成此任务。

使用运行PowerShell的
Exec
任务:

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>


礼貌地说,像这样的东西应该可以工作,但没有检查计数数千个文件的性能,只是为了得到数组长度

<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>

$([System.IO.Directory]::GetFiles(“%(Directories.Identity)”,“*”,System.IO.SearchOption.AllDirectories.get_Length())

我认为这是不对的。不得删除包含包含文件的目录的目录。请参阅OP第一行中有关递归等的精确文本。包含包含文件的目录的目录将不会被删除,因为使用AllDirectories选项的此类目录的文件计数将不会为0。啊,我没有注意
AllDirectories
部分。对于在树的深处包含大量文件的深度嵌套的树来说,效率有点低,但我怀疑这在实践中通常是个问题。不过,我觉得它相当优雅。谢谢这不是我想要的(依赖于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>