如何在批处理脚本中使用 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.test1
与 n 相同 testmappe3
和
x张力 .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"$
我正在尝试使用 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.test1
与 n 相同 testmappe3
和
x张力 .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"$