4

我尝试创建一个批处理文件来自动重命名文件夹中包含的文件,从这个结构:A12345678.textornumbers.textornumbers.txt 到更简单的一个:A12345678.txt

我试过这样的事情:

@echo off
ECHO Renaming files
Pause
:begin
ECHO Renaming txt files
for /r %%x in (A*.*.*.txt) do (REN "%%x" A*.txt)
ECHO Renaming finished
:end
pause
done

它不返回任何错误,但它什么也不做......

编辑:

好的,可以通过其他方式看到问题:我想重命名剩余的前 9 个字符和扩展名的文件。

我在这里看到了一个类似的问题: Deleting characters from filename

我修改并调整到我的情况有这个:

@echo off
ECHO Renaming files
Pause
:begin
REM setlocal enabledelayedexpansion (the result is the same with and without this line)
set X=9
ECHO Renaming files
for /r %%f in (*.txt) do if %%f neq %~nx0 (
    set "filename=%%~nf"
    set "filename=!filename:~%X%,-%X%!"
    ren "%%f" "!filename!%%~xf")
ECHO Done
ECHO Processing finished
:end
pause
done

但结果是这样的:

块引用!文件名!.txt

这是目录中的第一个图像,其他图像有错误(此类文件已存在)。

编辑2:

感谢我在互联网上找到的回复和其他信息,这是我的解决方案:删除文件名的最后一个字符,因为我想保留前 9 个字符:

@echo off
ECHO renaming files
ECHO.
Pause
:begin

set ext=QUB
set num=17
FOR /f "tokens=*" %%f in ('dir /b /a *.%ext%') do call :lab %%f
ECHO Done
pause
Exit

:lab
set original=
set original=%*
set newname=
call set newname=%%original:.%ext%=%%
call set newname=%%newname:~0,-%num%%%.%ext%
if "%newname%"==".%ext%" (goto :eof)
ren "%original%" "%newname%"
ECHO %newname%
goto :eof

这不是我的代码,而是我从其他人那里使用的解决方案(由 Carlitos.dll 提供)。我希望它可以帮助其他有类似问题的人。感谢您的想法和帮助!

4

3 回答 3

4

该脚本确实做了一些事情,但没有任何用处 - 它将每个文件重命名为其原始名称:-(

这一切都与 REN 如何使用通配符的规则有关。我从来没有在任何地方看到任何关于 REN 工作原理的正确解释。所以几周前我做了广泛的实验并制定了一套规则来解释我观察到的所有行为。

您可以在 Windows RENAME 命令如何解释通配符中找到我的结果在 StackExchange 超级用户网站上。

您的问题很容易通过在您的目标名称中替换*为许多来解决。?只需确保数量?大于或等于您将处理的最大前导名称长度。A如果不更改值,也不需要指定前导。

for /r %%x in (A*.*.*.txt) do ren "%%x" ?????????????????????.txt

以上必须迭代每个文件。尽管我没有测试过,但仅迭代文件夹可能会更快一些

for /r /d %%x in (.) do ren "%%x\A*.*.*.txt" ?????????????????????.txt

也可以使用 FOR /F 解析名称,这样您就不必担心?.

for /r %%x in (a*.*.*.txt) do (
  for /f "delims=." %%n in ("%%~nx") do ren "%%x" "%%n.txt"
)

根据修改后的问题进行编辑

要简单地保留最多 1st 9 个字符和.txt扩展名,解决方案更加简单,只需使用 9 ?

for /r /d %%x in (.) do ren "%%x\*.txt" ?????????.txt

如果要重命名所有文件,而不仅仅是.txt文件,那么

for /r %%F in (*) do ren "%%F" "?????????%%~xF"
于 2012-10-05T11:48:23.340 回答
0

你也可以这样做:

for %%x in (*.textornumbers.txt) do (
  set nam=%%x
  if "!nam!" neq "!nam:.textornumbers=!" ren %%x !nam:.textornumbers=!
)
于 2012-10-07T07:57:35.033 回答
0

使用~-modifiers,您可以执行以下操作:

  1. 仅取原始完整路径和名称(和扩展名)中的名称:

    FOR /R %%A IN (A*.*.*.txt) DO (
      ... %%~nA ...
    )

    这将把 aD:\path\A*.*.*.txt变成一个A*.*.*.

  2. 仅取 #1 结果中的名称:

    FOR /R %%A IN (A*.*.*.txt) DO (
      FOR %%B IN ("%%~nA") DO (
        ... %%~nB ...
      )
    )

    那会给你留下A*.*.

  3. 仅取 #2 中的名称:

    FOR /R %%A IN (A*.*.*.txt) DO (
      FOR %%B IN ("%%~nA") DO (
        FOR %%C IN ("%%~nB") DO (
          ... %%~nC ...
        )
      )
    )

    这会给你A*

  4. 从原始名称中提取扩展名并将其与#3 连接。这将是最终名称 ,A*.txt您现在可以将其提供给RENAME命令:

    FOR /R %%A IN (A*.*.*.txt) DO (
      FOR %%B IN ("%%~nA") DO (
        FOR %%C IN ("%%~nB") DO (
          RENAME "%%A" "%%~nC%%~xA"
        )
      )
    )
于 2013-05-29T15:01:55.550 回答