Primeiro, vamos revisar o que rm -rf
faz:
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
Existem três cenários nos quais rm -rf
é comumente usado o retorno esperado 0
:
- O caminho especificado não existe.
- O caminho especificado existe e é um diretório.
- O caminho especificado existe e é um arquivo.
Eu vou ignorar toda a coisa das permissões, mas ninguém usa permissões ou tenta negar a si mesmo o acesso de gravação às coisas no Windows de qualquer maneira (OK, isso é uma piada ...).
Primeiro, defina ERRORLEVEL
como 0 e, em seguida, exclua o caminho apenas se existir, usando comandos diferentes, dependendo de ser ou não um diretório. IF EXIST
não define ERRORLEVEL
como 0 se o caminho não existir; portanto, ERRORLEVEL
é necessário definir primeiro como 0 para detectar corretamente o sucesso de uma maneira que imite o rm -rf
uso normal . É necessário proteger o RD
com , IF EXIST
porque RD
, ao contrário rm -f
, lançará um erro se o destino não existir.
O seguinte snippet de script supõe que DELPATH seja pré-citado. (Isso é seguro quando você faz algo parecido SET DELPATH=%1
. Tente colocar ECHO %1
um .cmd
e passar um argumento com espaços e veja o que acontece por si mesmo). Após a conclusão do snippet, você pode verificar se há falhas 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%
A questão é que tudo é mais simples quando o ambiente está em conformidade com o POSIX. Ou se você instalar um MSYS mínimo e apenas usá-lo.