You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
6.9 KiB
174 lines
6.9 KiB
3 years ago
|
param(
|
||
|
$Path,
|
||
|
[switch] $Single
|
||
|
)
|
||
|
#$TargetName = "俺だけ入れる隠しダンジョン〜こっそり鍛えて世界最強〜";
|
||
|
$TargetName = ""
|
||
|
#$DestinName = "真の仲間"
|
||
|
#$Path = ""
|
||
|
#$Path = "H:\Data\Downloads\因為不是真正的夥伴而被逐出勇者隊伍\[Shin no Nakama][04][BIG5][1080P].mp4"
|
||
|
$JsonPath = $("..\Anime\* $TargetName", $($Path -replace '(.*\\[^\[\\\]]*)\\\[.*', '$1') | ? {Test-Path $_})
|
||
|
$WorkData = $(if (Test-Path "$JsonPath\animelibk.json") {
|
||
|
Get-Content "$JsonPath\animelibk.json" | ConvertFrom-Json
|
||
|
} else {
|
||
|
"" | select ID, WorkName, TargetName, DestinName, Season, Episode
|
||
|
})
|
||
|
|
||
|
# 確認資料狀態,缺少則進行物件資料建立
|
||
|
if (-not($WorkData.WorkName)) {
|
||
|
$WorkData.WorkName = Read-Host "請輸入作品名稱:";
|
||
|
}
|
||
|
if (-not($WorkData.TargetName)) {
|
||
|
$WorkData.TargetName = $($JsonPath -replace '.*\\[0-9\s]*(.*)$', '$1');
|
||
|
}
|
||
|
if (-not($WorkData.DestinName)) {
|
||
|
$WorkData.DestinName = Read-Host "請輸入目地的名稱:";
|
||
|
}
|
||
|
if (-not($WorkData.Season)) {
|
||
|
[int] $WorkData.Season = Read-Host "請輸入季別:";
|
||
|
}
|
||
|
if (-not($WorkData.Episode)) {
|
||
|
$WorkData.Episode = @();
|
||
|
}
|
||
|
$WorkData
|
||
|
|
||
|
$Seasons_TC = "", "第一季", "第二季", "第三季", "第四季", "第五季"
|
||
|
$Year = $(get-date -Format ‘yyyy’)
|
||
|
|
||
|
# 取得目標資料夾是否存在,不存在建立資料夾,並取得資料夾物件
|
||
|
#$DestDir = $(if ( -not(Test-Path -Path ".\$DestinName\$($Seasons_TC[$Season])*")) {
|
||
|
# mkdir -p ".\$DestinName\$($Seasons_TC[$Season]) ($Year)"
|
||
|
#} else {
|
||
|
# Get-Item -Path ".\$DestinName\$($Seasons_TC[$Season])*"
|
||
|
#})
|
||
|
#$DestDir = $(New-Item -Path ".\$WorkData.DestinName\$($Seasons_TC[$WorkData.Season]) ($Year)" -ItemType Directory -Force)
|
||
|
|
||
|
function Get-StandName {
|
||
|
param (
|
||
|
$FileObj
|
||
|
)
|
||
|
|
||
|
# 進行傳入變數判斷,非 FileInfo 物件則視為 String,先進特殊字元處理,再取得物件
|
||
|
$File = $(if ($FileObj.GetType().Name -eq 'FileInfo') {
|
||
|
$FileObj
|
||
|
} else {
|
||
|
Get-Item -Path $($FileObj -replace '([\[\]])', '`$1')
|
||
|
})
|
||
|
|
||
|
# 因應檔名不同而設定多組正規方式
|
||
|
$Result = @(
|
||
|
#$($Path -match "\[([^\]]*)\]\[(\d{1,2})\]")
|
||
|
$($File.Name -match "[\[\s]([^\]]*?)(?:[\]\[\-\s]+)(\d{1,2})[\]\s]")
|
||
|
) | % { if ($_) { $Matches }}
|
||
|
|
||
|
# OLD Edition
|
||
|
#$File.Name -match "\[([^\]]*)\]\[(\d{1,2})\]" | Out-Null
|
||
|
#$Matches
|
||
|
#$newName = "{0} S{3:00}E{1}{2}" -f $Matches[1], $Matches[2], $File.Extension, $Season;
|
||
|
#$newName = "{0} S{3:00}E{1}{2}" -f $Result[1], $Result[2], $File.Extension, $WorkData.Season;
|
||
|
|
||
|
# 建立回傳資料物件,以方便後續資料處理。
|
||
|
$OutputData = "" | Select newName, Season, Episode, newFullName;
|
||
|
$OutputData.newName = $Result[1];
|
||
|
$OutputData.Season = $WorkData.Season;
|
||
|
$OutputData.Episode = [int] $Result[2];
|
||
|
$OutputData.newFullName = "{0} S{3:00}E{1}{2}" -f $Result[1], $Result[2], $File.Extension, $WorkData.Season;
|
||
|
#$OutputData | ConvertTo-Json;
|
||
|
|
||
|
# Type 2,在輸出顯示上,此型態建立較傾向 Hash,而上面 select 建立的,較偏向 pscustomobject
|
||
|
#$OutputData2 = @{
|
||
|
# newName = $Result[1];
|
||
|
# Season = [int] $WorkData.Season;
|
||
|
# Episode = [int] $Result[2];
|
||
|
# newFullName = "{0} S{3:00}E{1}{2}" -f $Result[1], $Result[2], $File.Extension, $WorkData.Season;
|
||
|
#};
|
||
|
#$OutputData2 | ConvertTo-Json;
|
||
|
|
||
|
#Write-Output $File;
|
||
|
#Write-Output $File.Name;
|
||
|
#Write-Output $newName;
|
||
|
#return $newName;
|
||
|
|
||
|
return $OutputData;
|
||
|
}
|
||
|
|
||
|
### Select Object Mode START ###
|
||
|
|
||
|
# 建立自定屬性 File 和運算公式
|
||
|
$FileObj = @{
|
||
|
label = "File";
|
||
|
Expression = {$_};
|
||
|
}
|
||
|
# 建立自定屬性 NewName 和運算公式
|
||
|
$NewNameObj = @{
|
||
|
label = "NewName";
|
||
|
Expression = {Get-StandName $_};
|
||
|
}
|
||
|
$StructPathObj = @{
|
||
|
label = "StructPath";
|
||
|
Expression = {$(New-Item -Path $(".\{0}\{1} ({2})" -f $WorkData.DestinName, $Seasons_TC[$WorkData.Season], $Year) -ItemType Directory -Force).FullName};
|
||
|
}
|
||
|
|
||
|
### # Select Object Mode END ###
|
||
|
|
||
|
# 運作模式
|
||
|
if ($Single) {
|
||
|
# 單集模式
|
||
|
$List = @(Get-Item -Path $($Path -replace '([\[\]])', '`$1'))
|
||
|
$BuildList = $List | select $FileObj, $StructPathObj, $NewNameObj | ? {$_.NewName.Episode -notin $WorkData.Episode}
|
||
|
#$BuildList | ? {$_.NewName.Episode -notin $WorkData.Episode} | Format-List
|
||
|
}
|
||
|
|
||
|
$ENDResult = $BuildList | % {
|
||
|
$Command = @{
|
||
|
ItemType = 'HardLink'
|
||
|
Path = $("{0}\{1}" -f $_.StructPath, $_.NewName.newFullName)
|
||
|
Target = $($_.File.Fullname -replace '([\[\]])', '`$1')
|
||
|
}
|
||
|
#try {
|
||
|
if (New-Item @Command) { $_.NewName }
|
||
|
#} catch {
|
||
|
|
||
|
#}
|
||
|
}
|
||
|
#$ENDResult
|
||
|
#$ENDResult.gettype();
|
||
|
$ENDResult | % { if ($_) { $WorkData.Episode += $_.Episode }}
|
||
|
$WorkData | ConvertTo-Json | Out-File -Encoding "UTF8" "$JsonPath\animelibk.json"
|
||
|
exit 0;
|
||
|
|
||
|
##### 以下試寫或測試用 #####
|
||
|
# SIG # Begin signature block
|
||
|
# MIIFxwYJKoZIhvcNAQcCoIIFuDCCBbQCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
|
||
|
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
|
||
|
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUuwJuleFHAYU44/Bdnmy+R8Lg
|
||
|
# /zKgggNSMIIDTjCCAjagAwIBAgIQdMnAQ4BDAo9Lgfn+QeDdhjANBgkqhkiG9w0B
|
||
|
# AQUFADAqMRMwEQYDVQQDDApOaWNrIENoYW5nMRMwEQYDVQQKDAplYXJpY2sub3Jn
|
||
|
# MB4XDTIxMTAzMTEwMDI1MVoXDTIyMTAzMTEwMjI1MVowMzEiMCAGCSqGSIb3DQEJ
|
||
|
# ARYTcGNuaWNrMTAwQGdtYWlsLmNvbTENMAsGA1UEAwwETmljazCCASIwDQYJKoZI
|
||
|
# hvcNAQEBBQADggEPADCCAQoCggEBAMEnEk3/5rkEMibDbbfOXQaerk5xXSJmY8gf
|
||
|
# FAVUbrGfjzYHcRsPRzdb/pstcZGS2XUCoX2a57lQhACStns9dXeYfWhzNeAiSEAy
|
||
|
# iaJzUj5ELcH5TzT+mjeJQX6upeHOexO1TmtuM6mugpl9SvNQFqbQXlPHHmoLE3OC
|
||
|
# UzzjEC0AkHkcSiLdqtmSbRmaomcDMbtJgZHUciWE/p6mmAbpv2R4rdKSYSiI8UsE
|
||
|
# UclzkeTNrYKmJNiM0R+X1LyZVY6HAHN8dR3tjBnEPYoPxRAz4d2FEajvumzosNUr
|
||
|
# ni9LROnRxQXa048ZcsNArNZDQXe+Rc+PWhzbqHhy8rBllgZ08XkCAwEAAaNnMGUw
|
||
|
# DgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMB8GA1UdIwQYMBaA
|
||
|
# FBXyUrhn78ppKe7GRmHS6vbsNae/MB0GA1UdDgQWBBRs5+Yfb/14jwpjUNpTUuR1
|
||
|
# 759t9TANBgkqhkiG9w0BAQUFAAOCAQEACSL1BqUcrqh+bBqr5rQ5mArCVxsBW92r
|
||
|
# HenPY48dKdhGgMODtxuo7osZLk7Il+aXhAsvNTSfmc92H5eDXFqZ565jm8r6FF1C
|
||
|
# f1oKxznmtxd4oyXflCRqBz+OGuXLq8dG9gWT7OisKWe0hifSMGaZ9afpNeiFLuD1
|
||
|
# GSGk5E0W+bUyezCmjOdNWYIW452brt8rJS21WWVVvrsGjgJoTdsoAkFek8OEm82+
|
||
|
# 1UR7xZOHybLvi8N0gvD+UFlVvcv6pmgUqaz5DS7J2si75Xj9pThE6/bPu/fkpc53
|
||
|
# gMbleXNaqXIKeJTbI5hi2crlKyXBe/GfuK0Tv+06S1sL32VAs1VwmjGCAd8wggHb
|
||
|
# AgEBMD4wKjETMBEGA1UEAwwKTmljayBDaGFuZzETMBEGA1UECgwKZWFyaWNrLm9y
|
||
|
# ZwIQdMnAQ4BDAo9Lgfn+QeDdhjAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEK
|
||
|
# MAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3
|
||
|
# AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUKB0kQFrRK1Rl8rDZ
|
||
|
# lJnArnXkI8YwDQYJKoZIhvcNAQEBBQAEggEAmNgr9x6wFVh+uMHs/jvb8bIMbqtO
|
||
|
# 25NUc6PldBI6CJKmfAROUsUTpgKKq9mHjUlB3EfxnT1+VfMHJf48xwAMVipVW5yD
|
||
|
# N7l2apqfU4PPlAP0On4biq1WCpjGK6rES8mXwqr63Z8nKiXvfxGHLskhyVlPgfPL
|
||
|
# IM0AuvC1og/lpiGNDsMqH2qWD/HObXYMfpc5V8a02anHjilVmvXHFfzUZPSptvBT
|
||
|
# VmmDCscZY6UPU5eXIq8tWoAUbzrGPwAYYFJZkWembCI+FyJfV9BJzq4yFg/qgf4g
|
||
|
# hgqBiWBSbHgWkiKOwa6v3hdrEO9z+2strZn7OhNrnVCHq4A1mt96BzBo6A==
|
||
|
# SIG # End signature block
|