Спочатку давайте розглянемо, що 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
використання. Охороняти RD
с IF EXIST
необхідно, тому що RD
, на відміну від цього rm -f
, виникла помилка, якщо цілі не існує.
Наступний фрагмент сценарію передбачає, що 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 і просто використовуєте це.