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

时间:2019-05-16 18:21:43

标签: regex batch-file cmd file-rename

我有一个装满文件(.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”

另一方面:

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

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

有人可以帮忙吗?

PS-如果我使事情变得简单,可以将“我的视频3 [Summer] -MyEncode.avi”重命名为“ My_Video_3_ [Summer] -MyEncode.avi”(即删除空格)

1 个答案:

答案 0 :(得分:0)

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

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

=== 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"