PowerShell DSC如何删除指定路径子目录并保留根目录
保留根目录仅删除子目录的PowerShell DSC解决方案
你遇到的问题确实是DSC File资源的典型特性:当设置Ensure = "Absent"且Recurse = $true时,它会直接删除目标目录本身以及所有子项。要实现仅清理根目录下的内容、保留根目录的需求,这里提供两种可靠的解决方案:
方法1:使用Script资源实现精准清理
File资源无法直接满足"保留父目录"的需求,这时用Script资源自定义清理逻辑会更灵活可控:
#requires -version 4.0 #requires -RunasAdministrator param( [parameter(Position=0,Mandatory)] [string[]]$Computers ) Configuration RemoveWorkspace{ param( [parameter(Position=0,Mandatory)] [string[]]$Computers ) Node $computers { Script CleanDirectoryContents { GetScript = { # 检查目标目录是否有剩余子项,用于DSC状态报告 $childItems = Get-ChildItem -Path $using:DestinationPath -Force return @{ Result = if ($childItems) { "ContainsContents" } else { "Empty" } } } TestScript = { # 判断是否需要执行清理:有子项则返回$false,触发SetScript $childItems = Get-ChildItem -Path $using:DestinationPath -Force return (-not $childItems) } SetScript = { # 仅删除目标目录下的所有子项,保留目录本身 Get-ChildItem -Path $using:DestinationPath -Force | Remove-Item -Recurse -Force } # 传递目标路径参数 Parameters = @{ DestinationPath = "E:\Builds\1946" } } } } # 配置数据准备 $configData=@{AllNodes=$null} $nodes=@() ForEach($computer in $Computers){ write-host " Adding $computer "-ForegroundColor Green $nodes+=@{ NodeName="$computer" PSDscAllowPlainTextPassword=$true } } $configData.AllNodes=$nodes # 生成并执行配置 Write-Host "Enter Admin credentials" -ForegroundColor Green RemoveWorkspace $Computers -configurationdata $configData -outputpath C:\Temp\DeleteDirs\$computer Start-DscConfiguration -Path C:\Temp\DeleteDirs\$computer -Wait -Verbose -Force
这个Script资源的核心逻辑:
- TestScript:检查目录是否有子项,决定是否需要执行清理
- SetScript:精准删除所有子项但保留父目录
- GetScript:返回目录当前状态,用于DSC的状态追踪
方法2:拆分File资源的执行步骤
如果一定要用File资源,可以分两步操作:先确保根目录存在,再删除其下的所有子项:
Configuration RemoveWorkspace{ param( [parameter(Position=0,Mandatory)] [string[]]$Computers ) Node $computers { # 第一步:确保根目录存在(如果不存在则创建) File EnsureRootDirectory { Type = "Directory" DestinationPath = "E:\Builds\1946" Ensure = "Present" } # 第二步:删除根目录下的所有子项 File RemoveChildItems { Type = "Directory" DestinationPath = "E:\Builds\1946\*" Force = $true Ensure = "Absent" Recurse = $true DependsOn = "[File]EnsureRootDirectory" # 保证根目录先存在 } } }
这里通过DestinationPath = "E:\Builds\1946\*"匹配所有子项,再用DependsOn确保根目录的存在性,避免误删父目录。不过这种方法对隐藏文件/目录的处理可能不如Script资源彻底。
你提到已经初步解决了问题,期待你后续发布的最新代码,也欢迎分享你的解决方案帮助其他开发者~
内容的提问来源于stack exchange,提问作者Siva Sankara Rao Bacha
相关产品推荐
相关产品推荐

