Pertama, mari kita tinjau apa yang rm -rf
dilakukan:
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 -rf
biasanya 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 ERRORLEVEL
ke 0 dan kemudian hapus path hanya jika ada, menggunakan perintah yang berbeda tergantung pada apakah itu direktori atau tidak. IF EXIST
tidak diatur ERRORLEVEL
ke 0 jika jalur tidak ada, jadi pengaturan ERRORLEVEL
ke 0 pertama diperlukan untuk mendeteksi kesuksesan dengan cara yang meniru rm -rf
penggunaan normal . Menjaga RD
dengan IF EXIST
itu 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 %1
dalam .cmd
dan 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.