![](/img/trans.png)
[英]Create batch file to delete,rename and move multiple files multiple subfolder
[英]delete some files in a sub-subfolder using batch script
我需要一個批處理腳本,該腳本將從給定文件夾的子子文件夾中刪除除兩個文件之外的所有文件。 我有一組子文件夾的名稱,可以在其中找到文件set sf=(sf0 sf1)
這些子文件夾嵌套在給定路徑下的某個位置,例如
<givenPath>\something\anything\sf0
<givenPath>\whatever\sf1
我現在想在那些子文件夾中刪除除2以外的所有文件。
<givenPath>
所有其他文件和子文件夾必須保持不變。
我發現這可以通過以下方式實現:
for /R "%somePath%" %%D in (*.*) do (
if /I not "%%D"=="dontDelete.file" (
if /I not "%%D"=="hasToStay.file" (
echo del /S /Q "%somePath%\%%D"
)
)
)
我的問題現在是讓%some_path%
指向如上所述的正確子文件夾。
如何做到這一點? 還是我完全錯了並且有更好的方法?
您可以遞歸搜索文件名並刪除文件。
我不刪除子目錄,因為如果您要保留目錄,從您的問題尚不清楚。
除了兩個文件“ file1”和“ file2”之外,所有目錄中的所有文件都將被刪除,並且目錄將保留。 如果要刪除目錄,請刪除保留目錄的第一個if循環。
@echo off
rem set your two file names in these variables
set file1="a.txt"
set file2="b.txt"
for /f "delims=" %%a in ('dir /s /b *.*') do (
if exist %%~sa\NUL (
echo It is a directory, not deleted: %%~sa
) else if "%%~nxa" == %file1% (
echo Not deleted : %file1%
) else if "%%~nxa" == %file2% (
echo Not deleted : %file2%
) else (
del /s /q "%%a"
)
)
這將分兩步完成工作
首先,將生成文件夾的完整列表(在給定路徑下)。 文件夾列表被過濾為不包含“特殊”文件夾。 對於其余文件夾,將刪除所有文件。
接下來,將枚舉所有剩余的文件(這是第一步的原因,如果沒有必要,則不處理文件,而僅處理文件夾,因此第二個列表較短)。 過濾此列表以排除“特殊”文件夾下的任何“特殊”文件。 其余文件被刪除。
@echo off
setlocal enableextensions disabledelayedexpansion
rem configure starting path
set "givenPath=%cd%"
rem list of folders that need a special test
set "specialFolders="sf0" "sf1""
rem list of files to keep inside special folders
set "specialFiles="dontDelete.file" "hasToStay.file""
rem a temporary file will be needed
set "tempFile=%temp%\%~nx0.%random%.tmp"
rem STEP 1 - remove all files from non special folders
rem prepare temporary file to filter the list of folders
(for %%a in (%specialFolders%) do echo \%%~a) > "%tempFile%"
rem remove all files from not special folders
for /f "delims=" %%a in ('
dir /ad /s /b "%givenPath%" ^| findstr /i /v /e /l /g:"%tempFile%"
') do echo del /f /q "%%~fa\*"
rem STEP 2 - Delete all non special files from special folders
rem generate a temporay file to filter the list of files
(for %%a in (%specialFolders%) do for %%b in (%specialFiles%) do echo \%%~a\%%~b) > "%tempFile%"
rem remove any file not matching the special folder/files
for /f "delims=" %%a in ('
dir /a-d /s /b "%givenPath%" ^| findstr /i /v /e /l /g:"%tempFile%"
') do echo del /f /q "%%~fa"
rem remove temporary file
del /q "%tempFile%" >nul
它可以去除的第一步,其結果將是相同的,但不是執行一個del
非特殊文件夾的操作,將有del
每個在其內部文件的操作。
刪除操作僅回顯到控制台。 如果輸出正確,請刪除以del
命令為前綴的echo
這個用於測試的echo
命令使第二步找到第一步中尚未刪除的所有文件( echo
)。 如果不刪除第一步中的echo
,則第二步會更快,因為它必須處理更少的文件。
編輯以適應注釋-由於僅應刪除特殊文件夾中的非特殊文件
@echo off
setlocal enableextensions disabledelayedexpansion
rem configure starting path
set "givenPath=%cd%"
rem list of folders that need a special test
set "specialFolders="sf0" "sf1""
rem list of files to keep inside special folders
set "specialFiles="dontDelete.file" "hasToStay.file""
rem temporary files will be needed
set "folderFilter=%temp%\%~nx0.%random%.1.tmp"
set "fileFilter=%temp%\%~nx0.%random%.2.tmp"
rem prepare temporary file to filter the list of folders
(for %%a in (%specialFolders%) do echo \\%%~a\\[^^\\]*) > "%folderFilter%"
rem prepare temporary file to filter the list of files
(for %%a in (%specialFiles%) do echo \%%~a) > "%fileFilter%"
rem Search all files, filter and delete
for /f "delims=" %%a in ('
dir /s /b /a-d "%givenPath%"
^| findstr /i /e /r /g:"%folderFilter%"
^| findstr /i /e /l /v /g:"%fileFilter%"
') do echo del /f /q "%%~fa"
rem remove temporary files
del /q "%folderFilter%" > nul
del /q "%fileFilter%" > nul
檢索文件的完整列表( dir /s
),從中刪除特殊文件夾(帶有folderFilter的findstr
)內的所有內容,並從其余文件列表中刪除特殊文件(帶有fileFilter的findstr
)。 列表中的所有內容都將被刪除
與前面的代碼一樣,僅將del
操作回顯到控制台。 如果輸出正確,請刪除echo
以刪除文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.