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

TypeScript 复制代码
# Language: Powershell
# Style: TypeScript

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

function Remove-EmptyDirectories {
	param (
		[string]$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.IO.FileAttributes]::System) -and
			    -not ($attributes -band [System.IO.FileAttributes]::ReadOnly) -and
				-not ($attributes -band [System.IO.FileAttributes]::ReparsePoint)) {
					Remove-Item $dir.FullName -Force -Verbose
			}
		}
	}
}

function main {
	if ($args.Count -gt 0) {
			Remove-EmptyDirectories $($args[0])
	} 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
#>
Cobol 复制代码
:: 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 (

[string]$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.IO.FileAttributes]::System) -and

-not ($attributes -band [System.IO.FileAttributes]::ReadOnly) -and

-not ($attributes -band [System.IO.FileAttributes]::ReparsePoint)) {

Remove-Item $dir.FullName -Force -Verbose

}

}

}

}

function main {

if ($args.Count -gt 0) {

Remove-EmptyDirectories (args[0])

} 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

相关推荐
JUNIOR_MU8 天前
【VMware VCF】管理 VCF 环境中组件的密码策略。
powershell·vcf·vmware cloud foundation·powervcf·password management·password policy·password expiration·password complexity·account lockout
WBingJ8 天前
李宏毅机器学习-批次 (batch)和动量(momentum)
人工智能·机器学习·batch
Ztiddler8 天前
【CMD、PowerShell和Bash设置代理】
开发语言·深度学习·github·bash·powershell·代理·cmd
tiandyoin9 天前
批处理读取文本第n行并赋值给变量?--遍历所有行并赋值给变量数组
batch·批处理·cmd·findstr·查找文件的第m行第n列
耗子来啦(公众号:算法狗)14 天前
大模型面试题:当Batch Size增大时,学习率该如何随之变化?
开发语言·学习·batch
独行soc21 天前
#渗透测试#红蓝攻防#HW#漏洞挖掘#漏洞复现01-笑脸漏洞(vsftpd)
安全·渗透测试·脚本·护网·笑脸漏洞vsftpd漏洞·src挖掘
独行soc21 天前
#渗透测试#红蓝攻防#HW#漏洞挖掘#漏洞复现02-永恒之蓝漏洞
测试工具·安全·渗透测试·脚本·漏洞挖掘·永恒之蓝
geyee22 天前
win11 下 利用 PowerShell 提取 wps 表格中嵌入的图片
wps·powershell
zhangfeng113324 天前
连续变量的 交叉熵 如何计算 python tensorflow
开发语言·pytorch·matlab·batch