Спочатку давайте розглянемо, що 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, якщо шлях не існує, тому встановлення значення ERRORLEVEL0 спочатку необхідно для належного виявлення успіху таким чином, що імітує нормальне 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 і просто використовуєте це.