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
1182

被折叠的 条评论
为什么被折叠?



