Pertama, mari kita tinjau apa yang rm -rfdilakukan:
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
Ada tiga skenario di mana rm -rfbiasanya digunakan di mana ia diharapkan untuk kembali 0:
- Jalur yang ditentukan tidak ada.
- Path yang ditentukan ada dan merupakan direktori.
- Path yang ditentukan ada dan merupakan file.
Saya akan mengabaikan hal izin keseluruhan, tetapi tidak ada yang menggunakan izin atau mencoba untuk menolak akses tulis sendiri pada hal-hal di Windows (OK, itu dimaksudkan untuk menjadi lelucon ...).
Pertama set ERRORLEVELke 0 dan kemudian hapus path hanya jika ada, menggunakan perintah yang berbeda tergantung pada apakah itu direktori atau tidak. IF EXISTtidak diatur ERRORLEVELke 0 jika jalur tidak ada, jadi pengaturan ERRORLEVELke 0 pertama diperlukan untuk mendeteksi kesuksesan dengan cara yang meniru rm -rfpenggunaan normal . Menjaga RDdengan IF EXISTitu diperlukan karena RD, tidak seperti rm -f, akan membuat kesalahan jika target tidak ada.
Cuplikan skrip berikut mengasumsikan bahwa DELPATH sudah diprioritaskan. (Ini aman ketika Anda melakukan sesuatu seperti SET DELPATH=%1. Cobalah menempatkan ECHO %1dalam .cmddan lewat itu argumen dengan ruang di dalamnya dan melihat apa yang terjadi untuk diri sendiri). Setelah cuplikan selesai, Anda dapat memeriksa kegagalan dengan 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%
Intinya adalah, semuanya lebih sederhana ketika lingkungan hanya sesuai dengan POSIX. Atau jika Anda menginstal MSYS minimal dan gunakan saja.