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