假設我有一個串列檔案,其中包含我想根據串列定期洗掉的檔案夾名稱,
目前正在使用這個不能按我預期作業的批處理檔案:
setlocal enabledelayedexpansion
for /F "tokens=2* delims==" %%x in ('findstr/brc:"foldertodelete" garbagefolderlist.txt') do (
set "foldertodelete=%%x"
set foldertodelete=!foldertodelete:"=!
set foldertodelete=!foldertodelete:%%=^!!"
echo !foldertodelete!
if exist !foldertodelete! (
echo deleting !foldertodelete!
rmdir /s /q !foldertodelete!>nul
)
)
endlocal
里面的garbagefolderlist.txt:
foldertodelete="%programfiles%\blablabla"
fodlertodelete=%systemroot%\blablabla
foldertodelete="C:\Temp"
foldertodelete=D:\Temporary files\here
關于串列檔案 (garbagefolderlist.txt) 的注釋:
1.檔案夾名稱可能包含雙引號或不包含雙引號,所以我想動態消除批處理檔案中的雙引號
2. 檔案夾名稱可以是普通的或使用系統變數或不像 %systemroot% 等
3.檔案夾名稱可能包含空格
uj5u.com熱心網友回復:
如果您只想洗掉該文本檔案中列出的檔案夾,您只需要一行代碼。您需要使用該CALL命令來獲得所需的雙變數擴展。您甚至根本不需要延遲擴展。
for /F "tokens=2* delims==" %%x in ('findstr /bc:"foldertodelete" garbagefolderlist.txt') do call rmdir /s /q "%%~x" 2>nul
這是您的腳本在我的系統上的執行。我在 Program Files 中創建了一個檔案夾,并且在 C: 驅動器上也有一個 Temp 檔案夾。將不會選擇檔案中帶有 %systemroot% 的行,因為您在該行上有錯字。因此,該腳本只會嘗試處理您輸入示例中的三行。
我已將 echo 添加到代碼中并將錯誤轉儲洗掉到 nul 以便您可以看到所有輸出。
@echo off
for /F "tokens=2* delims==" %%x in ('findstr /bc:"foldertodelete" garbagefolderlist.txt') do (
call echo %%~x
call rmdir /s /q "%%~x"
)
這是該代碼的輸出。
C:\BatchFiles\SO\71120676>so.bat
C:\Program Files\blablabla
Access is denied.
C:\Temp
D:\Temporary files\here
The system cannot find the path specified.
因此,讓我們分解該輸出。
- 您可以看到 %programfiles% 變數已擴展,因為它正確地回顯了檔案夾名稱,但無法洗掉該檔案夾,因為我沒有以管理員身份從提升的 cmd 提示符運行。因此無法洗掉該檔案夾。
- 臨時檔案夾正確顯示并被洗掉。
- 我的系統上不存在最后一個目錄,因為我沒有 D: 驅動器,因此系統報告它找不到路徑。如果標準錯誤仍然被重定向到 NUL 設備,您將看不到錯誤,這就是為什么我在洗掉檔案夾之前不去檢查檔案夾是否存在。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/428972.html
