dos递归遍历目录删log

windows 版的 [1],递归删非空文件夹,同时打印目录树(不用 tree 命令)

  • 函数定义、传参见 [4,5]
    • :<函数名> 开始(其实是行号?),goto:eof 结束(其实只是 goto 文件尾?:eof 可能是自带的表示文件尾的行号)(exit /b 好像也可以结束,见 [9])。
    • 函数定义放在文件尾,中间用一行 goto:eof 隔开,否则好像会无脑执行一次,毕竟所谓定义好像只是行号 + goto
    • %0 函数名,%1 开始是参数,对应 linux shell 的 $0$1
    • setlocal-endlocal 域内定义的变量是局部变量,避免全局裸奔导致命名冲突。
  • <NUL set /p="<MESSAGE>",输出但不换行,见 [9]。
  • > nul 2>&1 屏蔽命令输出、报错。
  • rmdir 会删非空目录,所以此处可以直接用,是安全的。
  • for %%f in (*) do (...) 只会遍历当前目录的文件,文件夹不会,加 /r 参数则也会递归遍历子目录文件;for /d %%d in (*) do (...) 只遍历文件夹。
@echo off
setlocal enabledelayedexpansion
REM cls

call:clean log 0

REM functions
goto:eof

:clean
setlocal
	REM show tree
	REM echo path: %1, layer: %2
	if %2 GTR 1 (
		for /l %%i in (2, 1, %2) do (
			<nul set /p="|  "
		)
	)
	if %2 GTR 0 (
		<nul set /p="|- "
	)
	echo %1/

	REM remove empty sub-folders
	set /a layer = %2 + 1
	cd %1
	for /d %%d in (*) do (
		call:clean %%d %layer%
	)
	cd ..

	REM remove the folder IFF it's empty
	REM cuz `rmdir` WON'T remove a NON-EMTPY folder
	rmdir %1 > nul 2>&1
endlocal
goto:eof

References

  1. shell递归遍历目录删log
  2. bat文件循环、字符串
  3. dos bat批量创建软链接
  4. 【DOS批处理】函数定义和用法
  5. bat 脚本之 使用函数
  6. dos | if
  7. dos | for
  8. FOR /D
  9. Windows batch: echo without new line
  10. Iterate all files in a directory using a ‘for’ loop
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值