Primeiro, vamos revisar o que rm -rffaz:
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 ERRORLEVELcomo 0 e, em seguida, exclua o caminho apenas se existir, usando comandos diferentes, dependendo de ser ou não um diretório. IF EXISTnão define ERRORLEVELcomo 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 -rfuso normal . É necessário proteger o RDcom , IF EXISTporque 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 %1um .cmde 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.