如何在批处理脚本中使用 for 循环排除文件夹被删除?

How to exclude folders from being deleted using a for loop in a Batch script?

我正在尝试使用 for 循环删除用户定义位置中的所有内容,但一个预定义文件夹中除外。为了不删除文件夹,我该如何去添加一个例外。

我正在尝试学习如何编码,但我承认我正在做一些小步骤。对于这个脚本的第一个输入部分,我得到了一些很好的提示,但我缺乏继续前进的知识。我搜索并找到了类似的代码,但 none 似乎有效。该脚本用于飞行模拟,希望能减轻安装特定项目的工作量。

根据 Whosebug 准则,这只是代码的一部分,它会删除所有内容,包括我要排除的文件夹。 ...

Rem This code is intended to delete all except one pre-defined folder
Echo Deleting all the files except testmappe3
del /s /q "%CD%"
for /d %%p in ("%CD%") do rmdir "%%p" except "%%testmappe3" /s /q 
dir
Pause
...

我预计输出会删除除 testfolder3 之外的所有文件夹

for /d %%A in ("%CD%\*") do (
    set "except="
    if /i "%%~nxA" == "testmappe3" set "except=1"
    if not defined except rmdir /s /q "%%~A"
)

此代码将迭代当前目录中的文件夹。 如果文件夹的name+ex张力为testmappe3, 那么 except 将被设置为 1 即用一个值定义。 如果未定义 except,rmdir 将删除该文件夹。

您可以添加更多 if 行来检查文件夹以排除。

修改器将识别一个文件夹,例如 named testmappe3.test1n 相同 testmappe3x张力 .test1.

查看 for /?call /? 修饰符。

查看 for /?set /?if /?rmdir /? 帮助这些命令。

首先,我会 非常 小心删除使用 %cd% 的所有内容,特别是如果脚本可能意外地 运行 作为管理员,其中 %cd% 将是 c:\windows\system32.

相反,使用 %~dp0 作为路径以确保您在正确的目录中。这一切都假设您没有 cd 脚本中较早的其他地方。

那么对于实际问题,我会包括 findstr 以排除目录 `testmappe3 以及脚本本身。

@echo off
cd /d "%~dp0"
for /f %%p in ('dir /b ^| findstr /vi /r /c:^testmappe3$') do (
    rmdir "%%p" /s /q >nul 2>&1
    if not "%%p"=="%~nx0" del /s /q "%%p" >nul 2>&1
)

如果你想坚持你原来的删除方法,那么它会像下面这样,但是如果你的脚本在同一个目录下,那么它也会被删除:

@echo off
cd /d "%~dp0"
del /s /q *
for /f %%p in ('dir /b ^| findstr /vi /r /c:^testmappe3$') do (
    rmdir "%%p" /s /q >nul 2>&1
)

如果您要排除的文件夹包含空格,则需要双引号。即

dir /b ^| findstr /vi /r /c:^"test mappe3"$