Batch file 清除多个目录-简化当前代码

Batch file 清除多个目录-简化当前代码,batch-file,Batch File,我正在使用批处理文件删除设置目录中的文件和文件夹。但我想知道是否有办法将当前代码简化为几行左右,而不是针对不同的目录重复每一行 下面是我当前的代码 @echo off DEL /A /F/Q /S "C:\Users\Testing\Documents\*.*" FOR /D %%p IN ("C:\Users\Testing\Documents\*.*") DO RD "%%p" /S /Q DEL /A /F/Q /S "C:\Users\Testing\Downloads\*.*" F

我正在使用批处理文件删除设置目录中的文件和文件夹。但我想知道是否有办法将当前代码简化为几行左右,而不是针对不同的目录重复每一行

下面是我当前的代码

@echo off

DEL /A /F/Q /S "C:\Users\Testing\Documents\*.*"
FOR /D %%p IN ("C:\Users\Testing\Documents\*.*")  DO RD "%%p" /S /Q
DEL /A /F/Q /S "C:\Users\Testing\Downloads\*.*"
FOR /D %%p IN ("C:\Users\Testing\Downloads\*.*")  DO RD "%%p" /S /Q
DEL /A /F/Q /S "C:\Users\Testing\My Pictures\*.*"
FOR /D %%p IN ("C:\Users\Testing\My Pictures\*.*")  DO RD "%%p" /S /Q
@echo关闭
setlocal enableextensions disabledelayedexpansion
对于%%a in(
“C:\Users\Testing\Documents”
“C:\Users\Testing\Downloads”
“C:\Users\Testing\My Pictures”
)请按d%%a&&(
rmdir./s/q
邻苯二胺
)
使用
for
命令迭代文件夹列表。对于列表中的每个文件夹,尝试将active directory更改为列表中的当前元素(
pushd
),如果可以(条件执行操作符
&&&
),则删除其中的任何内容(
rmdir./s/q
)并恢复以前的active directory(
popd

注意在前面的代码中,
rmdir/s/q
尝试删除文件夹和文件夹本身中的任何内容。无法删除该文件夹,因为我们已通过
pushd
用法将其设置为当前active directory。正如dbenham在评论中指出的,这意味着
rmdir
将显示一条错误消息,说明文件夹正在使用中,无法删除。虽然这是预期的行为(文件夹保护,而不是错误消息),但可能需要隐藏错误消息。这可以通过将错误输出流(流2)重定向到
nul
设备来实现:

这将隐藏与
rmdir
命令相关的任何错误(预期错误或非预期错误)

此技术可以扩展以隐藏以前代码中的任何错误(如果包含不存在的文件夹,
pushd
也会显示错误)

@echo关闭
setlocal enableextensions disabledelayedexpansion
2> 努尔(
对于%%a in(
“C:\Users\Testing\Documents”
“C:\Users\Testing\Downloads”
“C:\Users\Testing\My Pictures”
)请按d%%a&&(
rmdir./s/q
邻苯二胺
)
)
或者,如果您更喜欢选择性错误报告(dbenham的想法),可以将其扩展为:

@echo关闭
setlocal enableextensions disabledelayedexpansion
对于%%a in(
“C:\Users\Testing\Documents”
“C:\Users\Testing\Downloads”
“C:\Users\Testing\My Pictures”
)do(2>nul pushd“%%~a”)&(
rmdir./s/q 2>&1“findstr/lb”
邻苯二胺
)
这将隐藏
pushd
命令中的错误(如果文件夹不存在,则无需清理),并将显示
rmdir
命令中与除当前active directory之外的任何不可移动元素相关的任何错误。

@echo off
setlocal enableextensions disabledelayedexpansion
对于%%a in(
“C:\Users\Testing\Documents”
“C:\Users\Testing\Downloads”
“C:\Users\Testing\My Pictures”
)请按d%%a&&(
rmdir./s/q
邻苯二胺
)
使用
for
命令迭代文件夹列表。对于列表中的每个文件夹,尝试将active directory更改为列表中的当前元素(
pushd
),如果可以(条件执行操作符
&&&
),则删除其中的任何内容(
rmdir./s/q
)并恢复以前的active directory(
popd

注意在前面的代码中,
rmdir/s/q
尝试删除文件夹和文件夹本身中的任何内容。无法删除该文件夹,因为我们已通过
pushd
用法将其设置为当前active directory。正如dbenham在评论中指出的,这意味着
rmdir
将显示一条错误消息,说明文件夹正在使用中,无法删除。虽然这是预期的行为(文件夹保护,而不是错误消息),但可能需要隐藏错误消息。这可以通过将错误输出流(流2)重定向到
nul
设备来实现:

这将隐藏与
rmdir
命令相关的任何错误(预期错误或非预期错误)

此技术可以扩展以隐藏以前代码中的任何错误(如果包含不存在的文件夹,
pushd
也会显示错误)

@echo关闭
setlocal enableextensions disabledelayedexpansion
2> 努尔(
对于%%a in(
“C:\Users\Testing\Documents”
“C:\Users\Testing\Downloads”
“C:\Users\Testing\My Pictures”
)请按d%%a&&(
rmdir./s/q
邻苯二胺
)
)
或者,如果您更喜欢选择性错误报告(dbenham的想法),可以将其扩展为:

@echo关闭
setlocal enableextensions disabledelayedexpansion
对于%%a in(
“C:\Users\Testing\Documents”
“C:\Users\Testing\Downloads”
“C:\Users\Testing\My Pictures”
)do(2>nul pushd“%%~a”)&(
rmdir./s/q 2>&1“findstr/lb”
邻苯二胺
)

这将隐藏
pushd
命令中的错误(如果文件夹不存在,则无需清理),并将在
rmdir
命令中显示与除当前active directory之外的任何不可移动元素相关的任何错误。

首先,
RD/S/Q
命令将删除子目录中的所有文件,因此您可以从
DEL
命令中删除
/S
选项

现在谈谈你的实际问题——当然还有更好的办法:——)

任意复杂代码的通用解决方案是将所有公共代码放在接受一个或多个参数的子例程中,然后为每一组唯一参数调用子例程。确保在任何子例程之前包含一个
exit/b
,以确保主脚本在未进行调用的情况下不会落入子例程代码中

@echo off
call :del "C:\Users\Testing\Documents"
call :del "C:\Users\Testing\Downloads"
call :del "C:\Users\Testing\My Pictures"
exit /b

:del
del /a /f /q /s "%~1\*.*"
for /d %%p in ("%~1\*.*") do rd /s /q "%%p"
exit /b
如果需要,可以添加一个e
@echo off
call :del "C:\Users\Testing\Documents"
call :del "C:\Users\Testing\Downloads"
call :del "C:\Users\Testing\My Pictures"
exit /b

:del
del /a /f /q /s "%~1\*.*"
for /d %%p in ("%~1\*.*") do rd /s /q "%%p"
exit /b
@echo off
for %%P in (
  "C:\Users\Testing\Documents"
  "C:\Users\Testing\Downloads"
  "C:\Users\Testing\My Pictures"
) do call :del %%P
exit /b

:del
del /a /f /q /s "%~1\*.*"
for /d %%p in ("%~1\*.*") do rd /s /q "%%p"
exit /b
@echo off
for %%P in (
  "C:\Users\Testing\Documents"
  "C:\Users\Testing\Downloads"
  "C:\Users\Testing\My Pictures"
) do (
  del /a /f /q /s "%%~P\*.*"
  for /d %%p in ("%%~P\*.*") do rd /s /q "%%p"
)