“rm -rf” equivalent for Windows?

前端 未结 21 1524
一向
一向 2020-11-27 08:40

I need a way to recursively delete a folder and its children.

Is there a prebuilt tool for this, or do I need to write one?

DEL /S doesn\'t dele

21条回答
  •  南笙
    南笙 (楼主)
    2020-11-27 09:43

    First, let’s review what rm -rf does:

    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
    

    There are three scenarios where rm -rf is commonly used where it is expected to return 0:

    1. The specified path does not exist.
    2. The specified path exists and is a directory.
    3. The specified path exists and is a file.

    I’m going to ignore the whole permissions thing, but nobody uses permissions or tries to deny themselves write access on things in Windows anyways (OK, that’s meant to be a joke…).

    First set ERRORLEVEL to 0 and then delete the path only if it exists, using different commands depending on whether or not it is a directory. IF EXIST does not set ERRORLEVEL to 0 if the path does not exist, so setting the ERRORLEVEL to 0 first is necessary to properly detect success in a way that mimics normal rm -rf usage. Guarding the RD with IF EXIST is necessary because RD, unlike rm -f, will throw an error if the target does not exist.

    The following script snippet assumes that DELPATH is prequoted. (This is safe when you do something like SET DELPATH=%1. Try putting ECHO %1 in a .cmd and passing it an argument with spaces in it and see what happens for yourself). After the snippet completes, you can check for failure with 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%
    

    Point is, everything is simpler when the environment just conforms to POSIX. Or if you install a minimal MSYS and just use that.

提交回复
热议问题