将(年份)保存在重命名文件夹中

Posted

技术标签:

【中文标题】将(年份)保存在重命名文件夹中【英文标题】:Keep (year) in a folder renaming 【发布时间】:2020-09-14 12:07:59 【问题描述】:

我得到了下面的 powershell 代码,它将文件夹移动和重命名为电视节目文件夹和子季节文件夹,但我希望它保留第一个父年部分(2012 年):

一个例子:

编辑 2:我上传了一个文件夹示例,其中包含和不包含年份,以及带有 .mkv 扩展名的空文件。 powershell 脚本也位于我通常会执行它的位置。 希望我不要通过链接和使用此 gofile 站点来违反任何规则。 (以前没用过)。 只需将其提取到 C: 或其他位置,但如果它不是 C:,则必须更改硬编码的目标变量:

https://gofile.io/d/gSJw43

文件夹 --> 绿箭侠 (2012) 第 8 季 S08(1080p BluRay x265 HEVC 10bit AAC 5.1 Vyndros)\

包含文件 --> Arrow.S08E01.Starling.City.1080p.10bit.BluRay.AAC5.1.HEVC-Vyndros.mkv Arrow.S08E02.Welcome.to.Hong.Kong.1080p.10bit.BluRay.AAC5.1.HEVC-Vyndros.mkv Arrow.S08E03.Leap.of.Faith.1080p.10bit.BluRay.AAC5.1.HEVC-Vyndros.mkv Arrow.S08E04.Present.Tense.1080p.10bit.BluRay.AAC5.1.HEVC-Vyndros.mkv 箭头。 S08E05.Prochnost.1080p.10bit.BluRay.AAC5.1.HEVC-Vyndros.mkv Arrow.S08E06.Reset.1080p.10bit.BluRay.AAC5.1.HEVC-Vyndros.mkv Arrow.S08E07.Purgatory.1080p.10bit。 BluRay.AAC5.1.HEVC-Vyndros.mkv Arrow.S08E08.Crisis.on.Infinite.Earths.Part.Four.1080p.10bit.BluRay.AAC5.1.HEVC-Vyndros.mkv Arrow.S08E09.Green.Arrow。 &.The.Canaries.1080p.10bit.BluRay.AAC5.1.HEVC-Vyndros.mkv Arrow.S08E10.Fadeout.1080p.10bit.BluRay.AAC5.1.HEVC-Vyndros.mkv

创建文件夹并将文件移动到 Season 08 文件夹:

箭\第08季\

但我希望它保留 Show 文件夹中的年份部分:

绿箭侠 (2012)\第 08 季\

可以更改代码来做到这一点吗? (必须考虑到(xxxx)部分并不总是在原始名称中,因此代码必须查找:括号开始和数字和括号结束=(xxxx)

文件名不应更改

编辑开始以获得进一步解释: 我将默认从文件夹的根目录运行 powershell 脚本,该脚本应检查显示文件夹。请注意,会有几个不同的节目文件夹,每个文件夹可能包含一个或多个季节 .mkv 文件:

示例:

c:\test\powershell_script.ps1

c:\test\Arrow (2012) 第 8 季 S08(1080p BluRay x265 HEVC 10bit AAC 5.1 Vyndros\Arrow.S08E01.Starling.City.1080p.10bit.BluRay.AAC5.1.HEVC-Vyndros.mkv .

.

.

/

c:\test\Arrow (2012) 第 8 季 S08(1080p BluRay x265 HEVC 10bit AAC 5.1 Vyndros\Arrow.S08E10.Starling.City.1080p.10bit.BluRay.AAC5.1.HEVC-Vyndros.mkv

c:\test\Altered Carbon (2018) 第 2 季 S02 (1080p DS4K NF WEBRip x265 HEVC 10bit DDP 5.1 Vyndros)\Altered.Carbon.S02E01.Phantom.Lady.1080p.10bit.NF.WEBRip.DDP5.1 .HEVC-Vyndros.mkv .

.

.

/

c:\test\Altered Carbon (2018) 第 2 季 S02 (1080p DS4K NF WEBRip x265 HEVC 10bit DDP 5.1 Vyndros)\Altered.Carbon.S02E08.Phantom.Lady.1080p.10bit.NF.WEBRip.DDP5.1 .HEVC-Vyndros.mkv .

. .其他几个带有文件的显示目录

编辑完成

###############
# make a folder for each different name before the SXX (season part) 
# and make a subfolder named Season XX for each SXX part that differs from each other.
# 
###############

# $Sourcefolder = 


# $DstBase = "c:\!foldertest\"  # Destination folder
$DstBase = Read-Host 'what is destination folder ?'   # Destination folder

Get-ChildItem -Include *.mkv,*.mp4,*.srt,*.avi,*.txt,*.nfo -Recurse -File|  # pick files with these extensions
  Where-Object BaseName -match "^(?<Series>.*?)\.?S(?<Season>\d1,2)\.?E(?<Episode>\d2)"|
    ForEach-Object 
      $Destination = "0\1\Season 2:00\" -f $DstBase,$Matches.Series.replace('.',' ').Trim(),[int]$Matches.Season
      if (!(Test-Path $Destination))MD $Destination -Force | Out-Null
      "Moving file [0] to [1]" -f $_.FullName,$Destination # show information to user about files to Move 

      # popup window asking user for YES / NO confirmation
       $message  = 'User input'
       $question = 'Are you sure you want to proceed?'
       $choices  = '&Yes', '&No'

        $decision = $Host.UI.PromptForChoice($message, $question, $choices, 1)
        if ($decision -eq 0) 
            Write-Host 'confirmed'
         else 
            Write-Host 'cancelled'
        
      # 
  Write-Host 'fortsat'

      $_ | Move-Item -Destination $Destination -Force    #move files to destination
    

<# Sample tree after running the script:
> tree /F
└───series
    └───Breaking Bad
        ├───Season 01
        │       Breaking.Bad.S01E01.DVDRip.XviD-ORPHEUS.avi
        │       Breaking.Bad.S01E01.DVDRip.XviD-ORPHEUS.spa.srt
        │
        ├───Season 04
        │       Breaking.Bad.S04E01.Box.Cutter.720p.hdtv.x264-orenji.mkv
        │       Breaking.Bad.S04E01.Box.Cutter.720p.hdtv.x264-orenji.spa.srt
        │
        └───Season 05
                Breaking.Bad.S05E15.720p.HDTV.x264-EVOLVE.mkv
                Breaking.Bad.S05E15.720p.HDTV.x264-EVOLVE.spa.srt
#>

【问题讨论】:

【参考方案1】:

我认为在这种情况下,最好在进入循环之前确定输出路径:

$DstBase = 'D:\Test\Arrow (2012) Season 8 S08 (1080p BluRay x265 HEVC 10bit AAC 5.1 Vyndros)'

# get the source folder as DirectoryInfo object
$dstItem = Get-Item -Path $DstBase
# extract the year, season and series from the source folder name
$year    = ([regex]'(\(\d4\))').Match($dstItem.Name).Groups[1].Value
$season  = ([regex]'Season\s+(\d+)').Match($dstItem.Name).Groups[1].Value

# test if the folder name had a (year) part of not
if ([string]::IsNullOrWhiteSpace($year)) 
    $series = ($dstItem.Name -split 'Season')[0].Trim()
    $folder = '0\Season 1:00' -f $series, [int]$season

else 
    $series = ($dstItem.Name -split 'Season')[0].Replace($year, '').Trim()
    $folder = '0 1\Season 2:00' -f $series, $year, [int]$season

# and combine that to become a full target path
$Destination = Join-Path -Path $dstItem.Parent.FullName -ChildPath $folder

# create the folder if it does not exist
if (!(Test-Path -Path $Destination -PathType Container)) 
    $null = New-Item -Path $Destination -ItemType Directory

然后做你的循环:

Get-ChildItem -Path $DstBase -Include *.mkv,*.mp4,*.srt,*.avi,*.txt,*.nfo -Recurse -File |  # pick files with these extensions
  Where-Object BaseName -match "^(?<Series>.*?)\.?S(?<Season>\d1,2)\.?E(?<Episode>\d2)" |
    ForEach-Object 
      "Moving file [0] to [1]" -f $_.FullName, $Destination # show information to user about files to Move 

      # do your confirmation popups if you must

      # move the file
      $_ | Move-Item -Destination $Destination -Force    #move files to destination
    

【讨论】:

第一部分运行时出现以下错误:PS C:\!foldertest&gt; C:\!foldertest\Make_subfolders_from_SXX_part_of_filename_KEEP_YEAR.ps1 Exception calling "Replace" with "2" argument(s): "String cannot be of zero length. Parameter name: oldValue" At C:\!foldertest\Make_subfolders_from_SXX_part_of_filename_KEEP_YEAR.ps1:8 char:1 + $series = ($dstItem.Name -split 'Season')[0].Replace($year, '').Trim ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ FullyQualifiedErrorId : ArgumentException @muggi 这意味着变量$year 应该是类似(2012) 的东西是空的。可能,您使用的文件夹名称可能 没有 (年份)部分,或者年份不是 4 位数长,而您的所有示例都具有该名称。如果在现实生活中情况并非如此,那么请给出 真实 示例,以便我们知道如何处理。您的问题字面意思是:但我希望它将年份部分保留在 Show 文件夹中_ 我实际上写了“(必须考虑到(xxxx)部分并不总是在原始名称中,所以代码必须寻找:括号开始和数字和括号结束= (xxxx)" 但是是的,我应该更清楚地解释一下,年份部分并不总是在文件夹名称中,并给出更详细的数据样本,对不起 @muggi 对不起,我错过了。我已更新代码以检查一年部分。 感谢您的更新 :-) 似乎它只创建第 00 季文件夹并且不移动任何 .mkv 文件。我尝试在一次实例中运行您提供的两部分代码,每个代码和两个代码。 (不知道是否对代码的行为有任何影响)。我在原始帖子中添加了一个带有小压缩文件的链接,其中包含文件夹和文件名示例。 powershell 代码也在 zip 中,因此可以确定我打算从哪里运行它。

以上是关于将(年份)保存在重命名文件夹中的主要内容,如果未能解决你的问题,请参考以下文章

word文档在重命名时提示:源文件名和目标文件名相同。不能重命名,这是怎么回事。

CKFinder插件 - PHP - 重命名文件夹时找到删除空格

Google Maps Api在重命名包名称后无法识别包名称-Android

在android中重命名包名

tinyfiledialogs如何将文件保存在俄语命名文件夹中

WordPress 实现附件上传自动重命名但不改变附件标题