从目录名称中删除后缀

时间:2014-06-27 09:51:34

标签: batch-file directory findstr

简短的序言:目前处理非常尴尬的设置;我们签约的公司要求我们批量执行所有操作,因为下载软件和所有官僚机构的潜在危险。所以我必须完全批量处理这个问题 - 请不要添加,下载或PowerShell建议(:p)。

问题:

想象一个包含目录的目录,例如

  • 父文件夹
    • 子文件夹
    • 子文件夹(1)
    • 子文件夹(2)

他们都是唯一的参考:

  • 父文件夹
    • REF231_Subfolder
    • REF527_Subfolder(1)
    • REF8837_Subfolder(2)

现在我们要删除为防止重复名称而添加的后缀!因此,对于字符串替换的批处理相当具有挑战性的语法,它已经证明是一个很大的问题。让我引导您完成我目前拥有的代码,这些代码不起作用,但可能有用:

@ECHO off

setlocal enabledelayedexpansion

:: This returns all directories (/a:d), then pipes that to a findstr command,
:: that identifies the prefix at the end of the directory name.
for /f "eol=: delims=" %%F in ('dir /b /a:d ^| findstr ^.*^(*^)$') do (
   set F=%%F 
   set suffix=^(!F:*^(=!
   echo !suffix!
   set newname=!F:!suffix!=!
   echo !newname!
)

pause

问题:

我希望set newname=!F:!suffix!=!替换字符串F中的!suffix!值,即目录名,然后将其设置为变量!newname!。为什么!newname!!suffix!相同?

此外,请注意我已尝试使用%suffix%,以及无数其他可变语法,但都无济于事。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

!var1:!var2!=!(即延迟扩展内的延迟扩展)是不允许的(无法正确解析)。在您的情况下!var1:%var2%=! for块内的var2值更改将不起作用(var2没有延迟扩展)。

要使代码正常工作,您需要类似

的内容
for /f "delims=" %%F in ('dir /b /a:d ^| findstr /r /c:"^.*\(.*\)$"') do (
    echo %%F
    set "F=%%F"
    set "suffix=(!F:*(=!"
    echo !suffix!
    for /f "delims=" %%a in ("!suffix!") do set "newname=!F:%%~a=!"
    echo !newname!
)    

也就是说,由于您无法在延迟扩展中编写延迟扩展,因此请使用for可替换参数替换内部变量。

无论如何,这种情况可以简化。

for /d %%a in ( "*(*)" 
) do for /f "delims=(" %%b in ("%%~na"
) do echo ren "%%~fa" "%%~b"

对于带括号的每个文件夹,取其名称,并在括号中将其拆分。第一个令牌将保留没有后缀的新名称。然后ren命令将使用新名称重命名文件夹(它的完整路径)。

ren命令将回显到控制台。如果输出正确,请删除echo以重命名文件夹。

答案 1 :(得分:2)

您的原始算法,both MC ND's solutions假设文件夹名称中没有其他括号。此外,MC ND的第一个解决方案还假设文件夹名称中没有!。这两个假设都可能是安全的,但有一个相当简单的解决方案可以正确处理那些不太可能的并发症:

@echo off
setlocal disableDelayedExpansion
for /f "eol=: delims=" %%F in (
  'dir /b /ad "*(*)"^|findstr /r "^[^.][^.]*([0-9][0-9]*)$'
) do (
  pushd \
  set "old=%%F"
  setlocal enableDelayedExpansion
  set "new=!old:(=x\!"
  for %%A in ("!new!") do endlocal & set "new=%%~pA"
  popd
  setlocal enableDelayedExpansion
  set "new=!new:~1,-2!"
  set "new=!new:x\=(!"
  echo ren "!old!" "!new!"
  endlocal
)

如果一切正常,只需删除ECHO即可激活REN命令。