【プログラム】私にもできた!ビデオテープをコンパクトにデジタル化<③保存編>


BDフォルダサイズチェックと仕訳.bat

powershell -ExecutionPolicy RemoteSigned -File ./BDフォルダサイズチェックと仕訳.ps1

pause

BDフォルダサイズチェックと仕訳.ps1


<# ツール概要
【メニュー】は次の通り
 1 サムネイルが作成されているかをチェックしますか 
   → mp4とセットでサムネイル画像のjpgファイルが作成されているかをチェックし、メインフォルダへ移動
 2 フォルダの仕訳をしますか"
  → メインフォルダの仕訳を開始。仕訳先フォルダに「BD_nnn」のフォルダを作成して、その中にmp4とjpgを移動していく。
    23.032GBを超えるようであれば、新しい「BD_nnn」のフォルダを作成して、そちらに移動する。
    メインフォルダ内のファイルがなくなるまで行う。再実行時は、連番の最も大きい「BD_nnn」の続きから処理する。
 3 フォルダの仕訳配下のフォルダサイズを確認しますか
  → 「BD_nnn」のそれぞれのフォルダサイズを確認する処理
 4 Evernote用のjpgファイルのコピーをしますか"
  → jpgファイルの頭に「BD_nnn」の名前を付加して、別フォルダにコピーする処理
 8 初期フォルダを作成しますか
   → 初回時にフォルダを作成する
 9 処理を終了する"

■注意点
・フォルダパスは任意のものに変更してください
・ご利用のブルーレイメディアや書き込みソフトの仕様にあわせて「23.032GB」の値は書き込めるサイズに変更してください
 
■変更履歴(GiiQ)
2017/10/12 Ver1.0 新規公開
#>

Set-ExecutionPolicy RemoteSigned -Scope Process

#本プログラムのカレントパス
$scriptPath = $MyInvocation.MyCommand.Path
$ParentPath = (Split-Path -Parent $scriptPath) + "\"

#変換データのフォルダ設定
$02_H265_file  = $ParentPath + '02_H265_file'
$Global:02_H265_file_shiwake  = $02_H265_file + '\3.フォルダ仕訳'

$chk_folder =  $02_H265_file +  '\1.Check(目視)'
$temp_from = $02_H265_file +  '\1.Check(目視)\移動前Check'
$temp_to = $02_H265_file + '\2.サムネイル\'
$main_from = $02_H265_file +  '\2.サムネイル\'
$main_to = $02_H265_file + '\3.フォルダ仕訳\'
$02_H265_file_evernote  = $02_H265_file + '\4.ファイル名_Evernote'
$BD_folder = $02_H265_file + '\5.BD\'

#Global変数の初期化
$Global:Sum_size_temp = 0
$Global:hantei = 0
$Global:taisyo_path2 = 0
$Global:Folder_Size = 0
#$Global:$size_over_flg = 0

$mp4_file = "*.mp4"
$mp4_jpg_file = "*.jpg"


#######################
# 初期フォルダ作成
#######################
Function fnc_makefolder {
 $make_folder = @($chk_folder,$temp_from,$temp_to,$main_from,$main_to,$02_H265_file_evernote,$BD_folder)

 $make_folder | %{
     if(!(test-path $_)){
     write-host ""
     write-host "$_ のフォルダを作成します"
     New-Item $_ -type directory | Out-Null

     }
     else{
  "$_ フォルダが存在します"

     }
 }
}

#######################
# Yes(0)、No(1)の判定
#######################
Function choice_yes_no($message1) {
    #選択肢の作成
    $typename = "System.Management.Automation.Host.ChoiceDescription"
    $yes = new-object $typename("&Yes","実行する")
    $no  = new-object $typename("&No","実行しない")

    #選択肢コレクションの作成
    $assembly= $yes.getType().AssemblyQualifiedName
    $choice = new-object "System.Collections.ObjectModel.Collection``1[[$assembly]]"
    $choice.add($yes)
    $choice.add($no)

    #選択プロンプトの表示
    $answer = $host.ui.PromptForChoice("<実行確認>",$message1,$choice,0)

    return $answer
}

#######################
# 1 サムネイル作成のチェック
#######################
Function Thumbnails($param){
 
    if($param -eq 1){
        $Thumbnails_folder = $temp_from
        $idousaki = $temp_to
    }
    elseif($param -eq 2){
        $Thumbnails_folder = $main_from
        $idousaki = $main_to
    }
    
 $answer_result1 = choice_yes_no("サムネイルが作成されているかをチェックしますか")

 cd $Thumbnails_folder

 if($answer_result1 -eq 0){
        echo "yes"
     $count_1 = (Get-ChildItem -Path $Thumbnails_folder $mp4_file |  Measure-Object ).Count
        $count_2 = (Get-ChildItem -Path $Thumbnails_folder $mp4_jpg_file | Measure-Object).Count
        $count_OK = 0
        $count_NG = 0

 echo "mp4対象数: $count_1"
    echo "jpg対象数: $count_2"
 
 $taisyo_file1 = @()
    $taisyo_file1 = @(Get-ChildItem -Path ($Thumbnails_folder + "\*.*") -Include $mp4_file -Exclude $mp4_jpg_file | % {$_.Name} |  Sort-Object)

        for ( $j = 0 ; $j -lt $count_1 ; $j++){
   echo "----------- $j -----------------"
   echo $taisyo_file1[$j]
            $taisyo_file2 = ($taisyo_file1[$j] -replace ".mp4",".mp4.jpg")
            if (test-path $taisyo_file2){
                 echo $taisyo_file2
                 $count_OK++
            }
            else{
                write-host $taisyo_file2 "NG" -ForegroundColor yellow
                $count_NG++
            }
  }
        Write-host "================================="
        Write-host "OK:" $count_OK
        Write-host "NG:" $count_NG
        Write-host "================================="

        if($count_OK -ge 1 -and $count_NG -eq 0){
            if($param -eq 1){
             $answer_result2 = choice_yes_no("mp4とjpgを $idousaki へ移動しますか")

                if($answer_result2 -eq 0){
                    echo "yes"
                    cd $Thumbnails_folder
                    $taisyo_file1 | ForEach-object -Process {Move-item ($_ -replace ".mp4",".*") $idousaki}
                    
                    echo "----------"
                }

          #メニューに戻る
          write-host "メニューに戻ります" -ForegroundColor yellow
          menu

            }
            elseif($param -eq 2){
             $answer_result2 = choice_yes_no("mp4とjpgをBDフォルダへ移動しますか")

                if($answer_result2 -eq 0){
                    echo "yes"

                    shiwake

                    cd $Thumbnails_folder
                    Write-Host "一番最新のフォルダは $taisyo_path2 で、$Folder_Size GBです"  -ForegroundColor yellow
                    $taisyo_file1 | ForEach-object -Process {
                        $File_Size = [math]::Round((Get-ChildItem ($_ -replace ".mp4",".*") -Force | Measure-Object -Sum Length).Sum / 1GB , 3)
                        write-host " " $File_Size " GB"
                        write-host  ($_ -replace ".mp4",".*")
                        shiwake_start $taisyo_path2 $File_Size

                        if($hantei -eq "OK"){
                            echo "ファイルを移動します"
                            Move-item ($_ -replace ".mp4",".*") $taisyo_path2
                            echo "==================================="
                        }
                        elseif($hantei -eq "Over"){
                            #echo "中断します。フォルダを作成してください"
                            #EXIT

                            ##shiwake  一つ処理を戻さないと
                            ##Move-item ($_ -replace ".mp4",".*") $taisyo_path2

                            echo "上限を超えました。フォルダを作成してください"
                   make_folder
                            Thumbnails 2
                        }
                    }
                 break
                }
            }
        }
 }
 elseif($answer_result1 -eq 1){
  echo "No"
  #Exit
 }
}

#######################
# 2 フォルダの仕訳
#######################
Function shiwake_start($Param_path,$Param_File_Size){
        ##$Folder_Size = [math]::Round((Get-ChildItem $Param_path -Recurse -Force | 
        ##Measure-Object -Sum Length).Sum / 1MB , 1)
        ##$message2 = [string]($Folder_Size) + " MB"
        
        #Write-Host "$message2 $Param_path のサイズ"
        $Global:Sum_size_temp = $Sum_size_temp + $Param_File_Size
        $Sum_Size = $Folder_size + $Sum_size_temp

        if($Sum_Size -lt 23.032){
            write-host "合計 $Sum_Size GBです。(判定:23.032 GB未満)"
            $Global:hantei = "OK"
        }
        else{
            write-host "$Sum_Size GB です。23.032 GBをオーバーします。"  -ForegroundColor yellow
            $Global:hantei = "Over"
        }
}

Function make_folder{
           $answer_result3 = choice_yes_no("$folder_name2 のフォルダを作成しますか")
        
             if($answer_result3 -eq 0){
                write-host "フォルダを作成します"
                New-Item -path $02_H265_file_shiwake -name $folder_name2 -itemType Directory
            
                #変数初期化
                $Global:Folder_Size = 0
                $Global:Sum_size_temp = 0

             }
             else{
                write-host "処理を中断します"
                Exit
            } 
}

Function shiwake{

    $folder_name = ((Get-ChildItem -path $02_H265_file_shiwake | Where-Object { $_.PSIsContainer } | Sort-Object -Descending name)[0].Name)
    $folder_name_num = [int]($folder_name.Substring($folder_name.Length - 3, 3))
    
    $Global:taisyo_path2 = $02_H265_file_shiwake + "\" + "$folder_name"
    $Global:Folder_Size = [math]::Round((Get-ChildItem $taisyo_path2 -Recurse -Force | Measure-Object -Sum Length).Sum / 1GB , 3)  
    
        write-host "一番最新のフォルダは $folder_name ($Folder_Size GB)です。"  -ForegroundColor yellow
   
       if($Folder_Size -lt 23.032){
            $answer_result2 = choice_yes_no("この続きでよいですか")
        }
        else{
            $answer_result2 = 1
        }

        if($answer_result2 -eq 0){
            echo "yes"

         #次のフォルダ名をセットしておく
            $folder_name_nextnum = $folder_name_num + 1
            $Global:folder_name2 = [String]::Format("BD_{0:000}",$folder_name_nextnum)
            return

         }
        elseif($answer_result2 -eq 1){

            $folder_name_nextnum = $folder_name_num + 1
            $Global:folder_name2 = [String]::Format("BD_{0:000}",$folder_name_nextnum)
        
            Global:$taisyo_path2 = $02_H265_file_shiwake + "\" + $folder_name2

   #Function呼び出し
   make_folder
        shiwake

        }    
}

#######################
# 3 フォルダサイズの確認
#######################
function Get-DirectoryVolume
{
    [CmdletBinding()]
    param
    (
        [parameter(
            position = 0,
            mandatory = 1,
            valuefrompipeline = 1,
            valuefrompipelinebypropertyname = 1)]
        [string[]]
        $Path = $null,

        [parameter(
            position = 1,
            mandatory = 0,
            valuefrompipelinebypropertyname = 1)]
        [validateSet("KB", "MB", "GB")]
        [string]
        $Scale = "KB",

        [parameter(
            position = 2,
            mandatory = 0,
            valuefrompipelinebypropertyname = 1)]
        [switch]
        $Recurse = $false,

        [parameter(
            position = 3,
            mandatory = 0,
            valuefrompipelinebypropertyname = 1)]
        [switch]
        $Ascending = $false,

        [parameter(
            position = 4,
            mandatory = 0,
            valuefrompipelinebypropertyname = 1)]
        [switch]
        $OmitZero
    )

    process
    {
        $path `
        | %{
            Write-Verbose ("Checking path : {0}. Scale : {1}. Recurse switch : {2}. Decending : {3}" -f $_, $Scale, $Recurse, !$Ascending)
            if (Test-Path $_)
            {
                $result = Get-ChildItem -Path $_ -Recurse:$Recurse `
                | where PSIsContainer `
                | %{
                    $subFolderItems = (Get-ChildItem $_.FullName | where Length | measure Length -sum)
                    [PSCustomObject]@{
                        Fullname = $_.FullName
                        $scale = [decimal]("{0:N4}" -f ($subFolderItems.sum / "1{0}" -f $scale))
                    }} `
                | sort $scale -Descending:(!$Ascending)

                if ($OmitZero)
                {
                    return $result | where $Scale -ne ([decimal]("{0:N4}" -f "0.0000"))
                }
                else
                {
                    return $result
                }
            }
        }
    }
}

#######################
# 4 Evernote用のjpgファイルのコピー
#######################
Function jpg_rename{
    $num = 0

    $answer_result4 = choice_yes_no("「$02_H265_file_shiwake」配下のフォルダが対象ですか")
    
    if($answer_result4 -eq 0){
      echo "yes"
      $folder_name = @(Get-ChildItem -path $02_H265_file_shiwake BD_* -Directory)
      cd $02_H265_file_shiwake
      $folder_name | %{ 
        write-host $num":" $_ 
        $num++
      }
    }
    elseif($answer_result4 -eq 1){
     echo "No"
         $nyuryoku_folder =(Read-Host 対象のパスを入力してください。)
        cd $nyuryoku_folder
        $folder_name = @(Get-ChildItem -path $nyuryoku_folder  BD_* -Directory)
        $folder_name | %{ 
            write-host $num": "$_ 
            $num++
         }   
    }

    if($folder_name -ne $null)
    {
        $num_1 =(Read-Host "開始Noを入力してください。")
        $num_2 =(Read-Host "終了Noを入力してください。")

        $folder_num = @($num_1..$num_2)

        $folder_num | % {
            $h = 0
            $taisyo_folder = $folder_name[$_] 
            write-host "----- 対象フォルダ:"  $taisyo_folder "--------"
            $taisyo_file = ((Get-ChildItem -Path  $taisyo_folder  $mp4_jpg_file | Sort-Object name).Name)
     write-host "対象ファイル数: $taisyo_file.lengh"
            $taisyo_file | % { 
                
                $new_name = "【$taisyo_folder】$_"
                $02_H265_file_evernote_name = $02_H265_file_evernote + "\" + $new_name
                
                $now_name = "$taisyo_folder\$_"
                
                if(test-path $02_H265_file_evernote_name){
                    copy-item $now_name $02_H265_file_evernote_name -Confirm
                }
                else{
                    copy-item $now_name $02_H265_file_evernote_name
                }
                $h++
            }
            Write-Host "------------処理回数 $h ---------------"
        }

    }
    else{ Exit}

}

########### menu ############
Function menu{
 echo "【メニュー】"
 echo " 1 サムネイルが作成されているかをチェックしますか (\1.Check(目視)\@移動前Check)"
 echo " 2 フォルダの仕訳をしますか"
 echo " 3 フォルダの仕訳配下のフォルダサイズを確認しますか(23.032GB以内であればOK)"
 echo " 4 Evernote用のjpgファイルのコピーをしますか"
        echo " 8 初期フォルダを作成しますか"
 echo " 9 処理を終了する"
 echo ""
 $nyuryoku =(Read-Host どれかを選択してください)

 switch($nyuryoku)
 {
   "1" {
  Write-Output ("1が入力されました。") 
  Thumbnails 1
  break
  }
   "2" {
    Write-Output ("2が入力されました。") 
     Thumbnails 2
  break
  }
   "3" {
  Write-Output ("3が入力されました。") 

  # refine oneliner
  Get-ChildItem $02_H265_file_shiwake -Recurse `
          | where PSIsContainer `
          | %{
              $i=$_
              $subFolderItems = (Get-ChildItem $i.FullName | where Length | measure Length -sum)
              [PSCustomObject]@{
                  フォルダ名=$i.Name
                  GB=[decimal]("{0:N3}" -f ($subFolderItems.sum / 1GB))  
              }} `
          | format-Table -AutoSize  #| sort GB -Descending

  menu
  }
   "4" {
  Write-Output ("4が入力されました。") 
  jpg_rename
     break
  }
   "8" {
  Write-Output ("8が入力されました。") 
        fnc_makefolder
     break
  }
   "9" {
  EXIT
  }

   default {
  Write-Output ("登録されている以外の名前が入力されました。")
  menu
  }
 }
}



########### main ############
#menuを実行
menu

#メニューに戻る
write-host "メニューに戻ります"
write-host ""
menu