Innanzitutto, esaminiamo cosa rm -rffa:
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
Esistono tre scenari in cui rm -rfviene comunemente utilizzato dove dovrebbe tornare 0:
- Il percorso specificato non esiste.
- Il percorso specificato esiste ed è una directory.
- Il percorso specificato esiste ed è un file.
Ho intenzione di ignorare l'intera cosa dei permessi, ma nessuno usa i permessi o cerca comunque di negare l'accesso in scrittura alle cose su Windows (OK, questo è pensato per essere uno scherzo ...).
Innanzitutto impostare ERRORLEVELsu 0 e quindi eliminare il percorso solo se esiste, utilizzando comandi diversi a seconda che si tratti o meno di una directory. IF EXISTnon è impostato ERRORLEVELsu 0 se il percorso non esiste, quindi ERRORLEVELè necessario impostare prima su 0 per rilevare correttamente il successo in modo da simulare il normale rm -rfutilizzo. Proteggere il RDcon IF EXISTè necessario perché RD, diversamente rm -f, genererà un errore se il bersaglio non esiste.
Il frammento di script seguente presuppone che DELPATH sia prequotato. (Questo è sicuro quando fai qualcosa del genere SET DELPATH=%1. Prova a inserire ECHO %1una .cmde passandole una discussione con spazi all'interno e vedi cosa succede per te). Al termine dello snippet, puoi verificare la presenza di errori con 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%
Il punto è che tutto è più semplice quando l'ambiente è conforme a POSIX. O se installi un MSYS minimo e lo usi.