【问题标题】:Windows batch script to remove dashes from subfolders and the files within subfolders用于从子文件夹和子文件夹中的文件中删除破折号的 Windows 批处理脚本
【发布时间】:2021-04-14 01:08:00
【问题描述】:

我有一个充满子文件夹的文件夹,这些子文件夹的文件名偶尔会有破折号作为第六个字符。这些子文件夹将包含带有文件名的文件,这些文件也有破折号作为第六个字符。我需要删除子文件夹及其文件的文件名中的所有这些破折号。

出于我的目的,我已经研究并修改了一些代码,但脚本首先更改了子文件夹名称,这会破坏脚本,因为它试图更改现在重命名的子文件夹中的文件名。

有人可以指出解决方案的方向吗?

setlocal disableDelayedExpansion
for /f "delims=" %%F in ('dir /b /s ?????-*.*') do (
  set "old=%%F"
  set "new=%%~nF"
  setlocal enableDelayedExpansion
  ren "!old!" "!new:-=!"
  endlocal
)

【问题讨论】:

  • 尝试通过在dir 命令中添加/A:-Ddir 的输出中排除子文件夹
  • 你应该使用/A:D作为目录,没有必要为%%F定义一个变量,因为你可以直接使用它,%%~nF应该是%%~nxF,因为目录可以包括. 个字符。
  • @terror 但是如果从dir 命令中排除,OP 如何重命名目录?

标签: windows batch-file


【解决方案1】:

您当前代码的问题是目录的重命名是从根目录开始的,所以如果重命名完成,则找不到下一级文件夹/文件,因为它的父级现在重命名了一个错误。因此,首先通过排除目录/a-d 对文件运行for 循环,然后使用for /D 代替/Recursive 开关来重命名文件夹:

@echo off
for /f "delims=" %%F in ('dir /b /a-d /s "?????-*.*"') do call :process "%%~F"
for /D /R %%F in (?????-*.*) do call :process "%%~F"
goto :eof

:process
set "name=%~nx1"
ren "%~1" "%name:-=%"

结果

dirs 和之前的文件:

之后:

【讨论】:

  • 感谢所有回复。让我对这个解决方案感到困惑的一件事是它省略了 disableDelayedExpansion,我在我看过的所有 ren ... "%name:-=%" 示例中都认为这是必要的。
  • Delayedexpansion 默认禁用,除非您通过Setlocalcmd /V:ON 明确启用它,但也就是说,它根本不需要。如果您在代码块内设置和使用变量,则需要EnableDelayedExpansion,例如在您的问题代码中。