农民 发表于 2024-12-19 17:43:55

删除 C 盘空文件夹--递归删除

# Language: Powershell
# Style: TypeScript

# 文件名:
# "文件(夹):删除空文件夹.ps1"

function Remove-EmptyDirectories {
        param (
                $Path
        )
        # 获取所有目录,把子目录排列在父目录前面。
        # 删除所有子文件(夹)后,可判断父目录为空,进而再删除父目录。
        $directories = Get-ChildItem $Path -Recurse -Directory | Sort-Object -Property FullName -Descending
        foreach ($dir in $directories) {
                # 检查目录是否为空(排除 desktop.ini)
                if (-not (Get-ChildItem $dir.FullName -Recurse) -and
                  -not (Test-Path (Join-Path $dir.FullName "desktop.ini"))) {
                        # 检查目录属性,排除具有系统、只读和重分析点属性的目录
                        $attributes = (Get-Item $dir.FullName).Attributes
                        if (-not ($attributes -band ::System) -and
                          -not ($attributes -band ::ReadOnly) -and
                                -not ($attributes -band ::ReparsePoint)) {
                                        Remove-Item $dir.FullName -Force -Verbose
                        }
                }
        }
}

function main {
        if ($args.Count -gt 0) {
                        Remove-EmptyDirectories $($args)
        } else {
                        Write-Host "No arguments provided."
        }
}

main $args

# Usage:
# PowerShell.exe -File "文件(夹):删除空文件夹.ps1" "C:\"

<#
# 无回溯,只删除了叶子空目录
Get-ChildItem "C:\" -Recurse | Where-Object { $_.PSIsContainer -and @(Get-ChildItem $_.FullName -Recurse).Count -eq 0 } | Remove-Item
#>

:: Language: cmd
:: Style: Cobol

:: 使用方法: "你命名的脚本.bat" "C:\"

:DelEmptyDir
@        echo off&pushd "%TEMP%"&setlocal EnableDelayedExpansion
        @if not exist "%~1\" exit /b 0
        REM 设置要清理的路径
        set "targetPath=%~1"
        REM 遍历所有目录
        for /f "delims=" %%D in ('dir "%targetPath%" /s/b/ad ^| sort /r') do (
                set "dirPath=%%D"
                REM 检查目录是否为空
                set isEmpty=1
                dir /a/b "!dirPath!" | findstr .* >nul && set isEmpty=0
                REM 检查是否包含 desktop.ini 文件
                if exist "!dirPath!\desktop.ini" set isEmpty=0
                REM 检查目录属性
                for %%A in ("!dirPath!") do (
                        set "attr=%%~aA"
                        echo !attr! | find "R" >nul && set isReadOnly=1 || set isReadOnly=0
                        echo !attr! | find "S" >nul && set isSystem=1 || set isSystem=0
                        echo !attr! | find "L" >nul && set isReparsePoint=1 || set isReparsePoint=0
                )
                REM 如果目录为空且不包含特定属性或文件,则删除
                if "!isEmpty!"=="1" if "!isReadOnly!"=="0" if "!isSystem!"=="0" if "!isReparsePoint!"=="0" (
                        echo Deleting empty directory: "!dirPath!"
                        rd "!dirPath!" >nul 2>&1
                )
        )
@        endlocal & popd
@exit /b 0

不想麻烦,本想网上找一个简朴脚了事,没想太多照搬的,而且还错的离谱。只好本身搞个。

# 利用 Powershell 语言

function Remove-EmptyDirectories {
    param (
        $Path
    )
    # 获取全部目录,把子目录排列在父目录前面。
    # 删除全部子文件(夹)后,可判定父目录为空,进而再删除父目录。
    $directories = Get-ChildItem $Path -Recurse -Directory | Sort-Object -Property FullName -Descending
    foreach ($dir in $directories) {
        # 查抄目录是否为空(扫除 desktop.ini)
        if (-not (Get-ChildItem $dir.FullName -Recurse) -and 
            -not (Test-Path (Join-Path $dir.FullName "desktop.ini"))) {
            # 查抄目录属性,扫除具有体系、只读和重分析点属性的目录
            $attributes = (Get-Item $dir.FullName).Attributes
            if (-not ($attributes -band ::System) -and
                -not ($attributes -band ::ReadOnly) -and
                -not ($attributes -band ::ReparsePoint)) {
                    Remove-Item $dir.FullName -Force -Verbose
            }
        }
    }
}
function main {
    if ($args.Count -gt 0) {
            Remove-EmptyDirectories $($args)
    } else {
            Write-Host "No arguments provided."
    }
}
main $args
# PowerShell.exe -File "文件(夹):删除空文件夹.ps1" "C:\"
<#
 # 无回溯,只删除了叶子空目录
Get-ChildItem "C:\" -Recurse | Where-Object { $_.PSIsContainer -and @(Get-ChildItem $_.FullName -Recurse).Count -eq 0 } | Remove-Item
#>

:: ---------------------------------------------------------------------------------------------------------------------------
利用 CMD 命令:

:DelEmptyDir
@    echo off&pushd "%TEMP%"&setlocal EnableDelayedExpansion
    @if not exist "%~1\" exit /b 0
    REM 设置要清理的路径
    set "targetPath=%~1"
    REM 遍历全部目录
    for /f "delims=" %%D in ('dir "%targetPath%" /s/b/ad ^| sort /r') do (
        set "dirPath=%%D"
        REM 查抄目录是否为空
        set isEmpty=1
        dir /a/b "!dirPath!" | findstr .* >nul && set isEmpty=0
        REM 查抄是否包罗 desktop.ini 文件
        if exist "!dirPath!\desktop.ini" set isEmpty=0
        REM 查抄目录属性
        for %%A in ("!dirPath!") do (
            set "attr=%%~aA"
            echo !attr! | find "R" >nul && set isReadOnly=1 || set isReadOnly=0
            echo !attr! | find "S" >nul && set isSystem=1 || set isSystem=0
            echo !attr! | find "L" >nul && set isReparsePoint=1 || set isReparsePoint=0
        )
        REM 如果目录为空且不包罗特定属性或文件,则删除
        if "!isEmpty!"=="1" if "!isReadOnly!"=="0" if "!isSystem!"=="0" if "!isReparsePoint!"=="0" (
            echo Deleting empty directory: "!dirPath!"
            rd "!dirPath!" >nul 2>&1
        )
    )
@    endlocal & popd
@exit /b 0
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 删除 C 盘空文件夹--递归删除