在固定模式

时间:2017-11-07 18:43:27

标签: regex powershell

我有几个以下列格式命名的文件:

  

Friends.S05E01.Trailing-text-here.mkv
  Friends.S05E02.Trailing-text-here.mkv
...

  Friends.S05E24.Trailing-文本here.mkv

我想从文件名中删除" .Trailing-text-here" 段,并保留如下:

  

Friends.S05E01.mkv

我尝试了以下代码(我在测试期间回显了生成的文件名):

Get-ChildItem *.mkv | % {
    $newName = $_.Name -replace '^(Friends.S05E\d{2})\.*', '$1'.mkv
    echo $newName
    #Rename-Item $_ $newName
}

但结果与我所寻求的相反;上面的代码返回:

  

Trailing-text-here.mkv
  尾随文本here.mkv
...

  尾随文本here.mkv

为什么$1组与尾随部分匹配而不是我指定的部分?我在Windows 10 Pro上使用PsVersion 5.1.15063.674。

2 个答案:

答案 0 :(得分:1)

您无需转义点.字符。此外,包括$强制捕获,直到文件名结束:

Get-ChildItem *.mkv | % {
    $newName = $_.Name -replace '^(Friends.S05E\d{2}).*$', '$1.mkv'
    echo $newName
    #Rename-Item $_ $newName
}

答案 1 :(得分:1)

希望这会有所帮助,我写了一段时间回来做同样的事情。它只使用$baseName的长度来切断文件名,因此是xx,然后附加.mkv

$folder = '\\nas\media\TV\Friends\Season 5'

$baseName = 'Friends.S05Exx' # Make sure ends in S00E

$files = Get-ChildItem $folder

foreach ($file in $files)  
{

  $fileName = $file.Name  
  $baseNumber = $fileName.Substring(0, ($baseName.Length)) 
  $renamed = $folder + "\" + $baseNumber + '.mkv'

  Write-Host "Rename $filename to $renamed"

  Rename-Item -path ($folder + "\" + $filename) -newname $renamed

}