Browse Source
			
			
			
			
				
		* 建立作品結構目錄,並建立連結檔案(HardLink Mode) * 分析路徑中目標名稱,並建立作品資料 * 分析集數並依據作品資料記錄,對已有建立鏈結的集數進排除(不確認目的地檔案是否存在) * -Single 單檔模式 * 命令列單檔作業master
				 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