You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:34:40