【问题标题】:How to delete long name folders under subfolder using batch file如何使用批处理文件删除子文件夹下的长名称文件夹
【发布时间】:2021-04-06 09:12:27
【问题描述】:

我正在尝试使用批处理文件删除子文件夹。 我有文件夹

  1. c:\users\mis
  2. c:\users\mis\A\第三方日志
  3. c:\users\mis\B\第三方日志
  4. c:\users\mis\C\第三方
  5. c:\users\mis\D\第三方

等等。 我想删除所有“第三方日志”文件夹,我厌倦了如下:

@echo off
Set MainFolder=C:\users\mis
FOR /D %%D IN ("%MainFolder%\*") DO CALL :RENAME %%D
pause & exit
REM -------------------------------------------------------
:RENAME
Set CRITERIA=Third Party Log
FOR /D %%R IN ("%1\%CRITERIA%") do @if exist "%%R" rd /s /q "%%R"
REM -------------------------------------------------------**

如果文件夹只有第三个,它正在删除。请帮我删除文件夹。

谢谢,

【问题讨论】:

  • 我自己不会执行这样的任务,我可能会考虑这样的事情,@For /D %%G In ("C:\Users\mis\*")Do @RD /S/Q "%%g\Third Party Log" 2>NUL,或者这个,@For /D /R "C:\Users\mis" %%G In ("Th?rd Party Log")Do @RD /S/Q "%%G",而不是。但是,在您的代码中,我建议您要么将:RENAME %%D 更改为:RENAME "%%D",将%1 更改为%~1,要么将%1 更改为%*(我建议你选择前者).
  • 除了修正我的错字,在第一个例子中,(%%g 应该是%%G),我能看到这种行为的唯一充分理由是您尝试删除的目录不是您的。或者更准确地说,您没有删除它们的必要权限。如果您使用的是第一个示例,并修复了错字,您还可以从末尾删除 2>NUL 以输出任何错误消息。
  • 嗨@Compo 它现在正在工作。是的 %%g 与众不同。非常感谢。你拯救了我的一天。度过美好的一天,保持安全。
  • 在您的(过于复杂的)代码中,您需要使用 call :RENAME "%%~D" 之类的引号,并将 %1 替换为 %~1"%%R" 替换为 "%%~R"...

标签: batch-file filenames subdirectory delete-file


【解决方案1】:
@ECHO OFF
SETLOCAL
rem The following settings for the source directory, destination directory, target directory,
rem batch directory, filenames, output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.

SET "targetdir=u:\your files"

SET "selectname=Third Party Log"

FOR /f "delims=" %%a IN (
 'dir /b /s /ad "%targetdir%\%selectname%" '
 ) DO (
 IF /i "%%~nxa"=="%selectname%" ECHO RD /S /Q "%%a"
)

只需执行dir /b /ad 即可列出与掩码%selectname% 匹配的所有目录名并删除所有匹配项。

请注意,for 循环可以压缩为一行,但为了清楚起见,我将其拆分为一个数字。

当然,如果需要,变量也可以用它们的字面值替换。这会将整个批次减少到可以直接在提示符处输入的单行,在这种情况下,每个%% 需要减少到单个%

发布的代码只是echoes 建议的指令以允许验证。如果显示的说明正确,请删除echo 关键字以实际销毁不需要的目录。

最后,在您的原始代码中,rename 不是子例程的好名称,原因有两个:首先,它具有误导性,因为没有执行重命名,其次,renrename 的别名 -并且让例程或变量或标签本身就是命令名并不是一个好主意。

【讨论】:

  • @user1202017 请将此标记为anwser(投票下的复选标记)
【解决方案2】:

遗憾的是,我无法编写代码并对其进行测试,但是:

您可以在临时文件中使用 dir 命令。 使用 findstr(或 find i m not shure)并查找第三方日志。 将其写回临时文件。 现在您应该留下一个文件,其中包含您想要删除的文件夹的路径。 逐行读取文件并删除并使用此行字符串为 del 命令提供路径。

要更改示例代码中的名称,您可以获取行字符串并将其用作 ren 命令的路径。

这很可能是一个非常糟糕的方法,但它应该可以工作。

【讨论】: