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

时间:2019-04-26 10:48:09

标签: batch-file cmd file-rename

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

示例:

BL_1402B103_abc.wav > BL_C1234-1_abc.wav

BL_15489B59_abc.wav > BL_C1234-5_abc.wav

因此,在上面的第一个示例中,我想将1402B103替换为C1234-1,所有文件的长度都相同,并且要替换的节用“ _”分隔。

我有一些代码可以查找/替换文件名的一部分,但是我需要对数百个文件执行此操作-有没有办法将Pattern =和Replace =作为变量从csv / list中提取并作为批处理运行?

Setlocal enabledelayedexpansion

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

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

3 个答案:

答案 0 :(得分:0)

您可以创建一个csv文件并添加搜索/替换字符串:

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文件中的每个字符串填充,并以逗号分隔,将第一个meta变量分配给search变量,将第二个meta变量分配给replace变量。然后,我们只需调用该过程即可对每个对象进行替换。

注意!在这种情况下,我在echo之前使用了ren来测试结果。只有对结果感到满意后,才能删除echo来执行实际的命令。

答案 1 :(得分:0)

我将使用共享软件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会在将文件重命名为具有新名称的其他文件时通知用户。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

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

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

答案 2 :(得分:-2)

批处理解决方案使得很难知道该怎么做。

按我的喜好,批处理太难读了。 %%和!和!在奇怪的地方。 ah。

您最好制作一个C#控制台应用程序,该应用程序会向您提供2条提示,并且就像我一样。

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