根据同一文件夹中的部分文件名匹配重命名文件名的子字符串
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"
我有一个装满文件(.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"