清空資料夾內容





琥珀
2012-01-02, 09:55 PM
最近構思的一個腳本,用來刪除資料夾內容,但不刪除資料夾本身。

經過簡易測試,在此提供給有需要的使用者。設計上有疏漏的地方,可以詳細說明問題。


@echo off

:start

if not "%~1"=="" (
if exist "%~1\" (
for /f "delims=" %%v in ('dir /ad /b "%~1\" ^2^>nul') do rd /s /q "%~1\%%v"
del /a /f /q "%~1\" 2>nul
)
shift /1
) else (goto:eof)

goto start


語法:empty <資料夾> [<資料夾>...]

限制:不支援萬用字元




mis339
2012-01-02, 10:14 PM
del 資料夾\*.* /s /q

也能達到目的,是這樣嗎?

把以下的內容存成bat或cmd,還可以透過帶參數的方式來執行,例如存成OF.bat,要刪掉A目錄底下所有的檔案但保留資料夾,那可以下OF A。
del %1\*.* /s /q

琥珀
2012-01-03, 12:49 PM
empty dir = rd /s /q dir & md dir

本來想找當時微軟在 Windows 2000 某網頁提供的範例,不過年代久遠,用搜尋引擎一時也找不到,所以只好自己寫一個來使用。

playkof
2012-01-03, 02:46 PM
執行 empty.BAT 在同一個目錄下的檔案都還在
我把資料夾拖到 empty.BAT 上 子資料夾也是會被砍

WIN7 64BIT

琥珀
2012-01-03, 07:55 PM
看起來是這樣的行為,沒有問題。其實這個小腳本,從去年想到今年,修改將近 20 回合,目前算能接受的結果。

為了防止誤操作,不存在任何參數,就不會有動作。喜歡的話,測試 empty . 和 empty c: d: e: 命令,就可以刪除現行目錄的資料,以及 C: D: E: 磁碟的所有資料。

有考慮檔案屬性,但是忽略權限的問題。

執行 empty.BAT 在同一個目錄下的檔案都還在
我把資料夾拖到 empty.BAT 上 子資料夾也是會被砍

WIN7 64BIT

琥珀
2012-01-04, 11:55 PM
今天回想到一種寫法,處理效率會好很多。


@echo off

:start

if not "%~1"=="" (
if exist "%~1\" (
pushd "%~1\"
rd /s /q . 2>nul
popd
)
shift /1
) else (goto:eof)

goto start


之所以說是回想,是因為當初搜尋範例時,有人提出的另類解法。經過簡易測試,既簡單又有效。

bx2aa
2012-01-05, 01:30 AM
我個人是不清楚 empty.bat 這個批次檔要做什麼?

rd /s /q . 2>nul

rd /s /q "%1" "%2" "%3" ......... 2>nul 不是直接可以刪嗎?


@ECHO OFF
CLS
:START
set /p INPUT="輸入路徑名稱 (例: c:\temp\test\ )? "
IF ERRORLEVEL 1 GOTO :eof
rd /s /q "%INPUT%" 2>nul
goto :START

按 <Enter> 結束
輸入目錄路徑名稱刪那個目錄 有 \ 刪裡面, 沒 \ 含自己都刪.

如果要用批次檔跑
test.bat

@ECHO OFF
CLS
:START
rd /s /q "%1" 2>nul
shift
if not "%~1"=="" goto :START

test "F:\Temp\empty\新資料夾\新資料夾\" "F:\Temp\empty\新資料夾\"

琥珀
2012-01-05, 07:10 PM
@ECHO OFF
CLS
:START
set /p INPUT="輸入路徑名稱 (例: c:\temp\test\ )? "
IF ERRORLEVEL 1 GOTO :eof
rd /s /q "%INPUT%" 2>nul
goto :START

按 <Enter> 結束
輸入目錄路徑名稱刪那個目錄 有 \ 刪裡面, 沒 \ 含自己都刪.

感謝提供新的想法。自己是在 Windows XP 測試功能,用這個腳本測試後還是有些奇怪,和期望的結果不同。

猜想是受到非 Windows 系統的影響?因為某些基本功能,多少會有解釋上的差異,不容易 100% 移植轉換。

由於個人喜好,這裡只寫出適合自己能理解的語法和行為,不太能列舉出各種應用方法,請大家包涵。

bx2aa
2012-01-06, 04:16 PM
mis339 說的
del %1\*.* /s /q
就是保留資料夾結構, 所有檔案都刪除.

只需改一下

@ECHO OFF
CLS
del c:\temp\delete-LOG.txt /q
:START
set /p INPUT="輸入路徑名稱 (例: c:\temp\test )? "
IF ERRORLEVEL 1 GOTO :eof
del /s /q "%INPUT%\*.*" 1>>c:\temp\delete-LOG.txt 2>&1
goto :START

批次檔方式
@ECHO OFF
CLS
del c:\temp\delete-LOG.txt /q
:START
if "%~1"=="" goto :eof
del /s /q "%1\*.*" 1>>c:\temp\delete-LOG.txt 2>&1
shift
if not "%~1"=="" goto :START


結果:
type c:\temp\delete-LOG.txt

刪除的檔案 - F:\Temp\test\新資料夾 (10)\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (10)\新資料夾\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (2)\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (2)\新資料夾\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (3)\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (3)\新資料夾\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (4)\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (4)\新資料夾\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (5)\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (5)\新資料夾\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (6)\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (6)\新資料夾\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (7)\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (7)\新資料夾\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (8)\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (8)\新資料夾\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (9)\新增文字文件.txt
刪除的檔案 - F:\Temp\test\新資料夾 (9)\新資料夾\新增文字文件.txt