【问题标题】:How to find and replace part of filenames from list如何从列表中查找和替换部分文件名
【发布时间】:2020-11-12 14:20:52
【问题描述】:

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

例子:

BL_1402B103_abc.wav > BL_C1234-1_abc.wav

BL_15489B59_abc.wav > BL_C1234-5_abc.wav

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

我有一些用于查找/替换文件名部分的代码,但我需要为数百个文件执行此操作 - 有没有办法将 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%!"
)

【问题讨论】:

  • 您的模式是静态文本还是只是分隔符 _ 之间的数字/字母,而结尾的 -1..-5 呢?这是一个计数器吗?跨度>
  • 抱歉,不知道静态文本是什么意思? -1..-5 是新名称的一部分,而不是计数器。对于每个文件Pattern=Replace= 会有所不同,需要匹配。 1402B103 实际上是一个 CD ID 编号,我想用我们的“真实世界”参考编号替换它。希望这是有道理的。
  • 那么你应该只选择实际包含你的模式的文件For %%f in (*%pattern%*.wav) Do (

标签: batch-file cmd file-rename


【解决方案1】:

您可以创建一个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 文件中的每个字符串查找,用逗号分隔,将第一个元变量分配给search 变量,将第二个元变量分配给replace 变量。然后我们只需通过调用该过程对每个进行替换。

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

【讨论】:

    【解决方案2】:

    我会使用共享软件 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 的解释。重定向运算符 > 必须在 FOR 命令行上使用插入符号 ^ 转义,以便在 Windows 命令解释器在执行命令 FOR 之前处理此命令行时解释为文字字符> 在后台启动的单独命令进程中执行嵌入的dir 命令行。

    【讨论】:

      【解决方案3】:

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

      Batch 对我来说太难以阅读了。 %% 和 !和 !!在奇怪的地方。呸。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-23
        • 2016-08-12
        • 2019-01-22
        • 2013-08-31
        • 2019-04-04
        • 1970-01-01
        相关资源
        最近更新 更多