1

我正在寻找一个批处理脚本来(递归地)重命名一个文件夹。重命名示例:34354563.randomname_newname.png 到 newname.png

我已经挖掘了正则表达式以匹配从字符串的开头到第一个下划线(它的^(.*?)_),但不能说服 Windows Batch 让我使用正则表达式进行复制或重命名。

4

4 回答 4

3

从命令行提示符 - 没有

FOR /R %f IN (*.*) DO FOR /F "DELIMS=_ TOKENS=1,*" %m IN ("%~nxf") DO @IF NOT "%n" == "" REN "%f" "%n"

在批处理文件中,双 %:

FOR /R %%f IN (*.*) DO FOR /F "DELIMS=_ TOKENS=1,*" %%m IN ("%%~nxf") DO @IF NOT "%%n" == "" REN "%%f" "%%n"

编辑:一个新的纯批处理解决方案发出以下情况:

  • 路径\文件名.ext => 名称.ext
  • Path\none.ext(什么都不做)
  • 路径\Some_file_name.ext => 文件名.ext
  • Path\name.some_ext (什么都不做)
  • 路径\Some_file_name.some_ext => name.some_ext

批处理(删除 ECHO 使其正常工作):

FOR /R %%f IN (*.*) DO CALL :UseLast "%%~f" "%%~nf"

GOTO :EOF

:UseLast
FOR /F "DELIMS=_ TOKENS=1,*" %%m IN (%2) DO IF "%%n"=="" (
    IF NOT "%~2"=="%~n1" ECHO REN %1 "%~2%~x1"
) ELSE CALL :UseLast %1 "%%n"
GOTO :EOF
于 2013-09-19T09:06:40.030 回答
3

避免_在扩展中:

@ECHO OFF 
FOR /F "DELIMS=" %%A IN ('DIR /S /B /A-D *_*.*') DO FOR /F "TOKENS=1*DELIMS=_" %%B IN ("%%~NA") DO IF "%%~C" NEQ "" ECHO REN "%%~A" "%%~C%%~XA"

查看输出并删除ECHO它是否看起来不错。

于 2013-09-19T11:49:43.440 回答
0

标准的 windows shell 没有正则表达式功能,实际上它非常基础。但是您可以使用 powershell 来执行此操作。

我对 power shell 不是很熟悉,但是另一个问题解释了如何过滤文件:使用 powershell 查找匹配两个单独的正则表达式的文件

于 2013-09-19T08:02:13.357 回答
0

新解决方案

使用JREN.BAT有一个非常简单的解决方案,这是我新的混合 JScript/批处理命令行实用程序,用于通过正则表达式搜索和替换重命名文件和文件夹。

只用一个下划线重命名文件:

jren "^[^_]+_([^_]+\.png)$" "$1" /s /i

保留第一个下划线之后的所有内容:

jren "^.*?_" "" /s /fm "*.png"

保留最后一个下划线之后的所有内容:

jren "^.*_" "" /s /fm "*.png"


==================================================== =======

原始答案

这可以使用名为 REPL.BAT 的混合 JScript/批处理实用程序来完成,该实用程序在标准输入上执行正则表达式搜索和替换,并将结果写入标准输出。以下所有解决方案都假定 REPL.BAT 在您的 PATH 中的某个位置。

我故意将 ECHO 设置为 ON,以便您获得执行的重命名命令的日志。如果您遇到名称冲突,这一点尤其重要:两个不同的起始名称都可能合并为相同的新名称。只有第一次重命名会成功 - 第二次将失败并显示错误消息。

我有三种解决方案,它们仅在处理包含超过 1 个_字符的名称方面有所不同。

此解决方案只会重命名名称中只有一个_的文件(忽略扩展名)。likea_b_c_d.txt将被忽略。

@echo on&@for /f "tokens=1,2 delims=*" %%A in (
  '2^>nul dir /b /s /a-d *_* ^| repl ".*\\[^_\\]*_([^_\\]*\.[^.\\]*)$" "$&*$1" a'
) do ren "%%A" "%%B"

下一个解决方案将在最后一个_. 像这样的名字a_b_c_d.txt会变成d.txt

@echo on&@for /f "tokens=1,2 delims=*" %%A in (
  '2^>nul dir /b /s /a-d *_* ^| repl ".*_([^\\_.]*\.[^.\\]*)$" "$&*$1" a'
) do echo ren "%%A" "%%B"

最后一个解决方案将保留第一个之后的名称_。一个喜欢的名字a_b_c_d.txt会变成b_c_d.txt. 这应该给出与 Endoro 答案相同的结果。

@echo on&@for /f "tokens=1,2 delims=*" %%A in (
  '2^>nul dir /b /s /a-d *_* ^| repl ".*\\[^\\]*?_([^\\]*\.[^.\\]*)$" "$&*$1" a'
) do echo ren "%%A" "%%B"
于 2013-09-19T13:15:58.843 回答