我需要一种递归删除文件夹及其子文件夹的方法。

是否有一个预先构建的工具,或者我需要编写一个?

DEL /S不删除目录。

DELTREE已从Windows 2000+中删除


当前回答

首先,让我们回顾一下rm -rf的作用:

C:\Users\ohnob\things>touch stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>mkdir stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>ls -l
total 0

C:\Users\ohnob\things>rm -rf stuff.txt

通常在三种情况下使用rm -rf,期望它返回0:

指定的路径不存在。 指定的路径已存在,且为目录。 指定路径已存在,且为文件。

我将忽略整个权限的事情,但没有人使用权限或试图拒绝自己对Windows中的东西进行写访问(好吧,这意味着一个笑话…)

首先将ERRORLEVEL设置为0,然后仅在它存在时删除路径,根据它是否是目录使用不同的命令。如果路径不存在,IF EXIST不会将ERRORLEVEL设置为0,因此必须先将ERRORLEVEL设置为0,以模仿正常rm -rf使用的方式正确检测成功。使用IF EXIST保护RD是必要的,因为与rm -f不同,如果目标不存在,RD将抛出一个错误。

下面的脚本片段假设DELPATH是预引用的。(当您执行SET DELPATH=%1之类的操作时,这是安全的。尝试将ECHO %1放在.cmd中,并传递给它一个带有空格的参数,看看自己会发生什么)。在代码段完成之后,您可以使用IF ERRORLEVEL 1检查失败。

: # Determine whether we need to invoke DEL or RD or do nothing.
SET DELPATH_DELMETHOD=RD
PUSHD %DELPATH% 2>NUL
IF ERRORLEVEL 1 (SET DELPATH_DELMETHOD=DEL) ELSE (POPD)
IF NOT EXIST %DELPATH% SET DELPATH_DELMETHOD=NOOP
: # Reset ERRORLEVEL so that the last command which
: # otherwise set it does not cause us to falsely detect
: # failure.
CMD /C EXIT 0
IF %DELPATH_DELMETHOD%==DEL DEL /Q %DELPATH%
IF %DELPATH_DELMETHOD%==RD RD /S /Q %DELPATH%

关键是,当环境符合POSIX时,一切都更简单。或者如果你安装了一个最小的MSYS并使用它。

其他回答

如果你使用的是旧版本的windows,还有deltree。

你可以从这里了解更多: SS64: DELTREE -删除所有子文件夹和文件。

通过Powershell

 Remove-Item -Recurse -Force "TestDirectory"

通过命令提示符

https://stackoverflow.com/a/35731786/439130

rmdir /S /Q %DIRNAME%

rm -r -fo <path>

是在Windows PowerShell中最接近的。它是的缩写

Remove-Item -Recurse -Force -Path <path>

(更多细节)。

公认的答案很好,但假设您已经安装了Node,您可以使用节点库“rimraf”更精确地做到这一点,它允许全局匹配模式。如果你经常使用它(我就是这样),就全局安装它。

yarn global add rimraf

然后,例如,我经常使用的一个模式:

rimraf .\**\node_modules

或者使用一行程序,让你避开全局安装,但动态下载包需要稍长时间:

npx rimraf .\**\node_modules