Voyons d'abord ce qui rm -rf
fait:
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
Il y a trois scénarios où rm -rf
est couramment utilisé où il devrait revenir 0
:
- Le chemin spécifié n'existe pas.
- Le chemin spécifié existe et est un répertoire.
- Le chemin spécifié existe et est un fichier.
Je vais ignorer toute la question des autorisations, mais personne n'utilise les autorisations ou essaie de se refuser l'accès en écriture sur les choses dans Windows de toute façon (OK, c'est censé être une blague…).
Tout d' abord mis ERRORLEVEL
à 0 et puis supprimez le chemin que si elle existe, à l' aide de différentes commandes selon si oui ou non il est un répertoire. IF EXIST
n'est pas défini ERRORLEVEL
sur 0 si le chemin d'accès n'existe pas, il ERRORLEVEL
est donc nécessaire de définir d'abord sur 0 pour détecter correctement le succès d'une manière qui imite l' rm -rf
utilisation normale . Protéger le RD
avec IF EXIST
est nécessaire car RD
, contrairement à rm -f
, va lancer une erreur si la cible n'existe pas.
L'extrait de script suivant suppose que DELPATH est précité. (C'est sûr lorsque vous faites quelque chose comme SET DELPATH=%1
. Essayez de mettre ECHO %1
un .cmd
et de lui passer un argument avec des espaces dedans et voyez ce qui se passe par vous-même). Une fois l'extrait de code terminé, vous pouvez vérifier l'échec avec 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%
Le fait est que tout est plus simple lorsque l'environnement est simplement conforme à POSIX. Ou si vous installez un MSYS minimal et que vous l'utilisez.