根据同一文件夹中的部分文件名匹配重命名文件名的子字符串

Rename substring of filename based on partial filename match in same folder

我有一个装满文件(.avi 和 .txt 文件)的文件夹:

MyVideo1-MyEncode.avi
MyVideo1.avi 16-05-2019 15-41-01.txt

My Video 2.avi
My Video 2.avi 16-05-2019 16-43-11.txt

My Video 3 [Summer]-MyEncode.avi
My Video 3 [Summer].avi 16-05-2019 17-57-24.txt

My Video 4-(Fall).avi
My Video 4-(Fall).avi 13-05-2019 19-29-16.txt

My Video 5-(Winter)-MyEncode.avi
My Video 5-(Winter).avi 11-05-2019 11-15-05.txt

如果.avi文件的文件名中包含"-MyEncode",我想将这部分字符串复制到相应文本文件的文件名中。

例如

"MyVideo1-MyEncode.avi" 在文件名

中包含文本 "-MyEncode"

所以: "MyVideo1.avi 16-05-2019 15-41-01.txt"

应重命名为: "MyVideo1-MyEncode.avi 16-05-2019 15-41-01.txt"

另一方面:

"My Video 2.avi" 包含字符串“-MyEncode”,因此不应重命名相应的 .txt 文件。

我有很多文件夹包含这样的文件。

有人可以帮忙吗?

PS - 如果我让事情变得更简单,我可以将 "My Video 3 [Summer]-MyEncode.avi" 之类的名称重命名为 "My_Video_3_[Summer]-MyEncode.avi"(即删除空格)

SPACE 字符不是问题。正则表达式使用的括号是。 [] and () 最好不要在文件名和目录名中使用这些。

在同一目录中创建这两 (2) 个文件。如果您对文件将被正确重命名感到满意,请从 Rename-Item cmdlet 中删除 -WhatIf

=== Do-EncRename.ps1

Get-ChildItem -Path 'C:/src/t/myenc/' -Filter '*-MyEncode.avi' |
    Where-Object { ! $_.PSIsContainer } |
    ForEach-Object {
        if ($_.Name -match '^(.*)\-MyEncode.avi') {
            $header = $Matches[1]
            Get-ChildItem -Filter ($header + "*.txt") |
                Where-Object { ! $_.PSIsContainer } |
                ForEach-Object {
                    if ($_.Name -match (($header -replace '[\[\]\(\)]', '.') + "(\.avi.*\.txt)")) {
                        $trailer = $Matches[1]
                        Rename-Item -LiteralPath $_.FullName -NewName ($header + '-MyEncode' + $trailer) -WhatIf
                    }
                }
        }
    }

=== Do-EncRename.bat

powershell -NoLogo -NoProfile -File "%~dp0%~n0.ps1"

而且,这里有一种不用 PowerShell 的方法。当 REN 语句看起来正确时,删除行开头的 echo

=== doit.bat

@echo off
setlocal enabledelayedexpansion

for /f "delims=" %%a in ('dir /b "*-MyEncode.avi"') do (
    set "FN1=%%~a"
    set "HEADER=!FN1:-MyEncode.avi=!"

    for /f "delims=" %%b in ('dir /b "!HEADER!.avi*.txt"') do (
        set "FN2=%%b"
        set "NFN=!FN2:.avi=-MyEncode.avi!"
        echo REN "!FN2!" "!NFN!"
    )
)

运行 .bat 脚本。

C:>CALL "myenc2.bat"
REN "My Video 3 [Summer].avi 16-05-2019 17-57-24.txt" "My Video 3 [Summer]-MyEncode.avi 16-05-2019 17-57-24.txt"
REN "My Video 5-(Winter).avi 11-05-2019 11-15-05.txt" "My Video 5-(Winter)-MyEncode.avi 11-05-2019 11-15-05.txt"
REN "MyVideo1.avi 16-05-2019 15-41-01.txt" "MyVideo1-MyEncode.avi 16-05-2019 15-41-01.txt"