Najpierw przejrzyjmy, co 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
Istnieją trzy scenariusze, w których rm -rf
powszechnie stosuje się tam, gdzie oczekuje się powrotu 0
:
- Podana ścieżka nie istnieje.
- Podana ścieżka istnieje i jest katalogiem.
- Podana ścieżka istnieje i jest plikiem.
Zamierzam zignorować całą kwestię uprawnień, ale nikt nie używa uprawnień ani nie próbuje odmówić sobie dostępu do zapisu w Windowsie (OK, to ma być żart…).
Najpierw ustaw ERRORLEVEL
na 0, a następnie usuń ścieżkę tylko wtedy, gdy istnieje, używając różnych poleceń w zależności od tego, czy jest to katalog. IF EXIST
nie ustawia wartości ERRORLEVEL
0, jeśli ścieżka nie istnieje, więc ustawienie wartości ERRORLEVEL
0 jako pierwsze jest konieczne do prawidłowego wykrycia sukcesu w sposób naśladujący normalne rm -rf
użycie. Ochrona za RD
pomocą IF EXIST
jest konieczna, ponieważ RD
w przeciwieństwie dorm -f
spowoduje błąd, jeśli cel nie istnieje.
Poniższy fragment skryptu zakłada, że DELPATH jest wstępnie cytowany. (Jest to bezpieczne, gdy zrobisz coś podobnego SET DELPATH=%1
. Spróbuj umieścić ECHO %1
w sposób .cmd
i przekazując jej argument ze spacjami w nim i zobaczyć, co dzieje się na siebie). Po zakończeniu fragmentu kodu możesz sprawdzić, czy wystąpił błąd 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%
Chodzi o to, że wszystko jest prostsze, gdy środowisko jest zgodne z POSIX. Lub jeśli zainstalujesz minimalny MSYS i po prostu go użyjesz.