Innanzitutto, esaminiamo cosa rm -rf
fa:
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 -rf
viene 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 ERRORLEVEL
su 0 e quindi eliminare il percorso solo se esiste, utilizzando comandi diversi a seconda che si tratti o meno di una directory. IF EXIST
non è impostato ERRORLEVEL
su 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 -rf
utilizzo. Proteggere il RD
con 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 %1
una .cmd
e 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.