Voyons d'abord ce qui rm -rffait:
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 -rfest 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 EXISTn'est pas défini ERRORLEVELsur 0 si le chemin d'accès n'existe pas, il ERRORLEVELest 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 -rfutilisation normale . Protéger le RDavec IF EXISTest 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 %1un .cmdet 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.