如何从列表中查找和替换部分文件名

How to find and replace part of filenames from list

我有一个文件列表,我需要在每个文件的相同部分使用不同的值重命名。

示例:

BL_1402B103_abc.wav > BL_C1234-1_abc.wav

BL_15489B59_abc.wav > BL_C1234-5_abc.wav

所以在上面的第一个例子中,我想用 C1234-1 替换 1402B103 所有文件的长度都相同,我想替换的部分由“_ 分隔”。

我有一些文件名的 finding/replacing 部分的代码,但我需要对数百个文件执行此操作 - 有没有办法从 csv/list 中提取 Pattern= & Replace= 作为变量和 运行 作为一个批次?

Setlocal enabledelayedexpansion

Set "Pattern=1402B103"
Set "Replace=C1234-1"

For %%f in (*.wav) Do (
    Set "File=%%~f"
    Ren "%%f" "!File:%Pattern%=%Replace%!"
)

您可以创建一个 csv 文件并添加您的 search/replace 字符串:

myfile.csv

1402B103,C1234-1
15489B59,C1234-5
etc,etc

批处理文件,myrename.cmd

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,* delims=," %%i in (myfile.csv) do (
    set "search=%%i"
    set "replace=%%j"
    call :fix
)
exit /b
:fix
    for %%a in (*!search!*.wav) do (
        set "file=%%a"
        set "file=!file:%search%=%replace%!!"
        echo ren "%%~fa" "!file!" 
)

它将搜索 csv 文件中的每个字符串,用逗号分隔将第一个元变量分配给 search 变量,将第二个元变量分配给 replace 变量。然后我们通过调用该过程简单地对每个进行替换。

注意!! 在这种情况下,我在 ren 之前使用 echo 来测试结果。只有当您对结果感到满意时,您才应该删除 echo 以执行实际命令。

我会使用共享软件 Total Commander 及其内置的多重重命名工具对文件进行多重重命名操作,该工具具有用于此类任务的易于使用的图形用户界面,可以查看新名称在执行重命名操作之前的文件。此文件重命名操作可以通过 Total Commander 完成,只需单击几下鼠标即可完成,只需在键盘上键入 C1234-。如果重命名操作因某种原因失败,Total Commander 甚至支持撤消操作。

让我们假设新文件名中的 C1234- 是一个固定的字符序列,15 是一个在每个重命名的文件中递增的数字。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "FileNumber=1"
for /F "eol=| delims=" %%I in ('dir BL_????????_abc.wav /A-D-H /B /ON 2^>nul') do (
    move /Y "%%I" "BL_C1234-!FileNumber!_abc%%~xI" >nul
    set /A FileNumber+=1
)
endlocal

此解决方案适用于该示例。

但是第一个下划线左边的字符串和第二个下划线右边的字符串因文件名而异?

在这种情况下,以下批处理文件可能是正确的解决方案:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "FileNumber=1"
for /F "eol=| delims=" %%I in ('dir *_????????_*.wav /A-D-H /B /ON 2^>nul') do (
    for /F "eol=| tokens=1,2* delims=_" %%A in ("%%~nxI") do (
        move /Y "%%I" "%%A_C1234-!FileNumber!_%%C" >nul
    )
    set /A FileNumber+=1
)
endlocal

使用带选项 /Y 的命令 MOVE 代替命令 REN 使文件重命名,甚至在文件上具有该名称的已存在。 Total Commander 会通知用户有关使用其他已存在新名称的文件重命名文件的问题。

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • move /?
  • set /?
  • setlocal /?

阅读有关 Using Command Redirection Operators 的 Microsoft 文章,了解 2>nul 的解释。重定向运算符 > 必须在 上使用脱字符 ^ 进行转义,以便 命令行在 Windows 命令解释器处理此命令时将其解释为文字字符执行命令 FOR 之前的行,它在后台启动的单独命令进程中执行嵌入式 dir 命令行。

批处理解决方案只会让人很难知道该怎么做。

批处理太难读了,我不喜欢。 %% 和 !和 !!在奇怪的地方。呸

你最好制作一个 C# 控制台应用程序,给你 2 个提示,然后像我一样去做。

无论如何,所演示的是,对于每个文件,您都将文件名作为字符串变量获取,并在该字符串变量中进行所有字符串替换。然后重命名该文件,或者在 C# 中重命名为 MoveTo(newPath),生成的字符串变量。