Trước tiên, hãy xem lại những gì 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
Có ba kịch bản rm -rf
thường được sử dụng ở nơi dự kiến sẽ trả về 0
:
- Đường dẫn được chỉ định không tồn tại.
- Đường dẫn đã chỉ định tồn tại và là một thư mục.
- Đường dẫn đã chỉ định tồn tại và là một tệp.
Tôi sẽ bỏ qua toàn bộ điều quyền, nhưng không ai sử dụng quyền hoặc cố gắng từ chối chính họ viết quyền truy cập vào mọi thứ trong Windows (OK, điều đó có nghĩa là một trò đùa đùa).
Đầu tiên được đặt ERRORLEVEL
thành 0 và sau đó xóa đường dẫn chỉ khi nó tồn tại, sử dụng các lệnh khác nhau tùy thuộc vào việc nó có phải là một thư mục hay không. IF EXIST
không được đặt ERRORLEVEL
thành 0 nếu đường dẫn không tồn tại, do đó, đặt ERRORLEVEL
thành 0 trước là cần thiết để phát hiện đúng thành công theo cách bắt chước rm -rf
sử dụng bình thường . Bảo vệ RD
với IF EXIST
là cần thiết bởi vì RD
, không giống như rm -f
, sẽ gây ra lỗi nếu mục tiêu không tồn tại.
Đoạn mã sau đây giả định rằng DELPATH được đặt trước. (Điều này an toàn khi bạn làm một cái gì đó như SET DELPATH=%1
. Hãy thử đưa ECHO %1
vào .cmd
và chuyển cho nó một đối số có khoảng trắng trong đó và xem điều gì xảy ra cho chính bạn). Sau khi đoạn mã hoàn thành, bạn có thể kiểm tra lỗi 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%
Điểm là, mọi thứ đơn giản hơn khi môi trường chỉ phù hợp với POSIX. Hoặc nếu bạn cài đặt một MSYS tối thiểu và chỉ cần sử dụng nó.