Browse Source
* 建立作品結構目錄,並建立連結檔案(HardLink Mode) * 分析路徑中目標名稱,並建立作品資料 * 分析集數並依據作品資料記錄,對已有建立鏈結的集數進排除(不確認目的地檔案是否存在) * -Single 單檔模式 * 命令列單檔作業master
pcnick
3 years ago
1 changed files with 173 additions and 0 deletions
@ -0,0 +1,173 @@
|
||||
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 |
Loading…
Reference in new issue