简短的序言:目前处理非常尴尬的设置;我们签约的公司要求我们批量执行所有操作,因为下载软件和所有官僚机构的潜在危险。所以我必须完全批量处理这个问题 - 请不要添加,下载或PowerShell建议(:p)。
问题:
想象一个包含目录的目录,例如
他们都是唯一的参考:
现在我们要删除为防止重复名称而添加的后缀!因此,对于字符串替换的批处理相当具有挑战性的语法,它已经证明是一个很大的问题。让我引导您完成我目前拥有的代码,这些代码不起作用,但可能有用:
@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%
,以及无数其他可变语法,但都无济于事。
感谢您的帮助!
答案 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命令。