将(年份)保存在重命名文件夹中
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> 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