要清理项目,我需要palette-library
从批处理脚本文件的当前位置开始查找名为的所有(子)文件夹,然后删除其所有内容,除了名为的文件夹penstyle-opacity textures
和名为的文件penstyle-opacity.plt
。我使用 Windows 7。
我在 Google 上搜索了很多次,但到目前为止,我只找到了一些可以搜索、查找和删除文件夹中所有内容或从预定义位置删除除特定文件之外的所有内容的代码片段。但是,我无法将两者结合起来。
答案1
也许不是最优雅的方式,但您可以先通过掩码存档文件,然后擦除文件树,然后使用路径解压存档。
例如:
7z a -r my_archive penstyle-opacity.plt
或者:
7z a -r my_archive "palette-library\penstyle-opacity textures\penstyle-opacity.plt"
尝试并选择更适合您的。
答案2
第一个参数是要删除的文件夹,其余的是文件例外列表,允许使用通配符,将删除除与列表匹配的文件之外的所有文件夹及其子文件夹。技巧是先隐藏所有例外,然后在删除后取消隐藏它们。
@echo off
rem test routine
call :DELDIREXCEPT "c:\testfolder" "pru 2" "must leave.docx" *.jpg *.png *.exe
GOTO :FIN
REM * * * * SUBROUTINES FROM HERE * * * *
REM
:DELDIREXCEPT
rem deletes folder except a list of files
rem ~ removes quotes
set delDir=%~1
if not exist "%delDir%" goto :FIN
pushd %delDir% 2>nul || goto :FIN
rem get rest of params
shift
rem https://stackoverflow.com/questions/357315/how-to-get-list-of-arguments/34920539#34920539
rem Delayed expansion disabled in order not to interpret "!" in param values;
rem however, if a param isn't quoted, chars like "^", "&", "|" get interpreted
setlocal disabledelayedexpansion
set param_0=0
:repeat
set "lastparam=%~1"
set /a param_0+=1
if defined lastparam (
set "param_%param_0%=%lastparam%"
echo Hide: "%lastparam%"
attrib "%lastparam%" +h /s /d 2>nul
shift
goto :repeat
) else set /a param_0-=1
setlocal enabledelayedexpansion
echo .. deleting %delDir%
del /s /q /a-h *.* 2> NUL
echo ...
:: unhide arguments
for /l %%Z in (1 1 %param_0%) do (
echo/ unHide: "!param_%%Z!"
attrib /s /d "!param_%%Z!" -h 2>nul
)
popd
goto :FIN
REM END DELDIREXCEPT
:FIN