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