İlk olarak, ne yaptığını gözden geçirelim rm -rf
:
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
rm -rf
Geri dönmesi beklenen yerlerde yaygın olarak kullanılan üç senaryo vardır 0
:
- Belirtilen yol mevcut değil.
- Belirtilen yol var ve bir dizin.
- Belirtilen yol var ve bir dosya.
Tüm izinleri göz ardı edeceğim, ancak kimse izinleri kullanmıyor ya da Windows'taki şeylere yazma erişimini reddetmeye çalışmıyor (Tamam, bu bir şaka demekti…).
Önce 0 olarak ayarlayınERRORLEVEL
ve sonra dizin olup olmadığına bağlı olarak farklı komutlar kullanarak yolu yalnızca varsa silin. yol yoksa 0'a IF EXIST
ayarlanmaz ERRORLEVEL
, bu nedenle ERRORLEVEL
başarıyı normal rm -rf
kullanımı taklit edecek şekilde doğru bir şekilde algılamak için önce 0'a ayarlamak gerekir . Koruma RD
ile IF EXIST
çünkü gerekli RD
aksine, rm -f
hedef yoksa, bir hata verir.
Aşağıdaki komut dosyası snippet'i DELPATH'in önceden alıntılandığını varsayar. (Böyle bir şey yaptığınızda güvenlidir SET DELPATH=%1
. ECHO %1
Bir .cmd
boşluk koymayı ve içinde boşluklar olan bir argüman iletmeyi deneyin ve kendiniz için neler olduğunu görün). Snippet tamamlandıktan sonra, ile hata olup olmadığını kontrol edebilirsiniz 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%
Mesele şu ki, ortam POSIX ile uyumlu olduğunda her şey daha basittir. Veya minimal bir MSYS yüklerseniz ve bunu kullanırsanız.