日曜プログラミング 2018.11.11 EpgDataCapBon(EDCB)でプログラム録画(時間指定)したときに、タイトル名を入れる方法(powershell使用)

お約束、自己責任で!

うちでは、ソースいじって $Title3 作ってマクロに渡しているんで、こっちの方面は全くのド素人なんです。
魔改造(いじりまくってどこ直したかよく覚えてないという。え、ちがう?)はプログラマーの夢だもんねヘ(^^ヘ)(ノ^^)ノヘ(^^ヘ)(ノ^^)ノ動きゃいいんです。公開しなければ。
大元のビルドのたびに直すのが面倒で、で、公開して動く方を・・・
まぁいじれる人は自分でできますものね^^;
ソース追えない人に教えると後で質問攻めと動かねーぞドヤぁ地獄見るんで( ^ω^)・・・

大きな変更がなければ、ビルド依存しない外部でやってみようというお話。
5chのDTV板でうまく完結していなかったようなのでなんてなく手を出してみた。そんなところです。
変更があっても柔軟に対応しやすいですし・・・バッチとかスクリプトとかテキストですからねヽ(*^。^*)ノ

今日中に片付けたかったので・・・「日曜プログラミング」って書いちゃったし!
コードも調整中なんで、デバッグコードてんこ盛りです。powershell のスクリプト触って4時間程度なんで細かいところはお察しで(^◇^;
いつものおま環デバッグのサンプルなので、カスタマイズして適当に使ってください。
たまたま動いただけで、内容に答えられないので、質問は受け付けません!ヽ(*^。^*)ノ
EDCB使いなら、ちょっとググればもっとバグのないいいコードがすぐできると思います! 丸投げフンッ((^^)ゞ --ー●Google先生

■ ソース2つ:右クリックから保存、拡張子は[.txt]を取り除いてください
RecAfterTSRename.bat.txt
RecAfterTSRename.ps1.txt

■ 文字化けする人のために、zipもとりあえずあげときます
RecAfterTSRename.zip

■ 落としたらまず、デバッグ用のコメントを消しましょう!
●録画設定で「番組情報を出力する」にチェックを入れておいてください。: タイトル名.ts.program.txt が作成されるようになります
.ts.program.txtの中の3行目のタイトル名をそのまま使っています


プログラム予約(時間指定予約)のREcName_Macro.dllの設定。
設定しなくても動く人はいいのですが、通常のEPGやキーワード録画で別のリネームかけているんで、指定してあります。INI書いてあればここで書かなくてもいいかも?。


録画の設定。まぁ普通です。テスト時間1分でスクリーンショット取った時のもの。
※注意:このサンプルではプログラム予約のこの時番組名に、「全角/半角空白」や記号などを使わないでください。たぶん動きません。


録画開始。[*.ts]と[*.ts.program.txt]が作成されればよいです。


録画終了。[*.ts.err]が作成されます。


waitかけてあるんで、10秒くらい待つとタイトル名が付加されると思います。
動かなかったらデバッグして5chにでも公開して・・・それほど大したものじゃないかw

各自自由に使うがよい!俺のソースじゃないけどな’`,、’`,、(ノ∀`)’`,、’`,、

よい日曜を・・・日が変わってた( ^ω^)・・・

■EpgDataCapBonで録画後の後マクロに設定するバッチ
(ここから下は閲覧用なので、コピペしないでね。半角記号とかエスケープとか制御文字とか面倒なのあるんで)
—-RecAfterTSRename.bat—-

@echo off
@rem お題:プログラム予約でREcName_Macro.dllで[$Title$-$SDYYYY28$$SDMM28$$SDDD28$-$STHH28$$STMM$$STSS$.ts]を指定した時のようにファイル名を変えたい
@rem むずいですよね( ^ω^)・・・まぁバッチファイルの勉強ということで

@rem プログラム予約(時間指定)時の後処理でファイル名にタイトルを入れるバッチです

@rem 基本的な使い方:
@rem EpgDataCapBon フォルダに RecAfterTSRename.bat(このファイル)とRecAfterTSRename.ps1(powershell script)の2つを置いてください
@rem プログラム予約時の後処理バッチにこのファイルを選択してください。
@rem ●録画設定で「番組情報を出力する」にチェックを入れてください。: タイトル名.ts.program.txt が作成されるようになります

@rem ※注意:このサンプルではプログラム予約のタイトル名に、「全角/半角空白」や記号などを使わないでください。
@rem 「全角/半角空白」などバッチファイルでは区切り文字になるので特別な処理をしないと動かないため。

@rem デバッグなどは構築上引っかかったものだけやっています。
@rem すべての環境で動くことを保証するものではございません。
@rem 動くようにカスタマイズしてね!てへぺろ(゚u゚)>ベー

@rem 動作確認:
@rem EpgDataCapBon xtne6f氏版-181110
@rem Windows10 64bit 1809 October2018

setlocal enabledelayedexpansion

@rem デバッグ用に直接変数は使ってない状態です
@rem 変数名すべてを直接指定することで動作確認できます

set TSNAME=$FilePath$
set RECPATH=$FolderPath$
set RECNAME=$FileName$
set RECTXT="$FolderPath$\$FileName$.ts.program.txt"
set RECTIME=$SDYYYY28$$SDDD28$-$STHH28$$STMM$$STSS$
@rem 豆:日付は時間まで入れてファイル名にすることで重複を防ぎましょう

@rem debug----setting
@rem set TSNAME=filename.ts
@rem set RECPATH=d:
@rem set RECNAME=filename
@rem set RECTXT=filename.ts.program.txt
@rem set RECTIME=20181111-123456
@echo test >filename.ts
timeout /t 5 > nul
@rem debug----end

@rem バッチファイルと同じところにログファイルを作り書き出します
set LOGNAME=RecAfterTSRename_Log.txt
set LOGFULLPATH=%~dp0%LOGNAME%

@rem ログファイルは追記する人はコメントアウト
del %LOGFULLPATH%

rem パワーシェルを呼び出すバッチファイルです。
rem RecAfterTSRename.bat(このファイル)
rem RecAfterTSRename.ps1(powershellコマンド)
rem 上記2つをEpgDataCapBon置いて、同じフォルダにある場合のサンプルソースです
rem 変数を明示的に直接渡しています。長いです(^◇^;

@rem powershell -NoProfile -ExecutionPolicy Unrestricted .\RecAfterTSRename.ps1 $FilePath$ %RECPATH% $FolderPath$ "$FolderPath$\$FileName$.ts.program.txt" $FileName$ %LOGFULLPATH%
powershell -NoProfile -ExecutionPolicy Unrestricted .\RecAfterTSRename.ps1 %TSNAME% %RECPATH% %RECTIME% %RECTXT% %RECNAME% %LOGFULLPATH%

@rem ログファイルを作成しない場合
@rem powershell -NoProfile -ExecutionPolicy Unrestricted .\RecAfterTSRename.ps1 %TSNAME% %RECPATH% %RECTIME% %RECTXT% %RECNAME%

goto end

@rem --------------------------------------------------------------------------
@rem デバッグ用(使える変数名)
@rem --------------------------------------------------------------------------
:debug

echo ---- >>%LOGFULLPATH%
echo $FilePath$ ファイルのフルパス(バッチのみ) >>%LOGFULLPATH%
echo $FolderPath$ ファイルのフォルダパス(最後に\はなし)(バッチのみ) >>%LOGFULLPATH%
echo $FileName$ ファイル名(拡張子なし)(バッチのみ) >>%LOGFULLPATH%
echo $Title$ 番組名(予約一覧の番組名に表示されているもの) >>%LOGFULLPATH%
echo $Title2$ 番組名([]の括弧でくくられている部分を削除したもの) >>%LOGFULLPATH%
echo ---- >>%LOGFULLPATH%
echo $ServiceName$ サービス名(予約一覧の放送局に表示されているもの) >>%LOGFULLPATH%
echo $SDYYYY28$ 28時間表記開始日の年4桁固定 >>%LOGFULLPATH%
echo $SDDD28$ 28時間表記開始日の日2桁固定 >>%LOGFULLPATH%
echo $STHH28$ 28時間表記開始時間の時2桁固定 >>%LOGFULLPATH%
echo $STMM$ 開始時間の分2桁固定 >>%LOGFULLPATH%
echo $STSS$ 開始時間の秒2桁固定 >>%LOGFULLPATH%
echo ---- >>%LOGFULLPATH%
echo $Drops$ 録画結果のドロップ数(バッチのみ) >>%LOGFULLPATH%
echo $Scrambles$ 録画結果のスクランブル数(バッチのみ)>>%LOGFULLPATH%
echo $Result$ 録画結果のコメント(バッチのみ) >>%LOGFULLPATH%
echo $TitleF$ $Title$と同内容でファイル名に使用できない記号が存在した場合全角に変換するもの(バッチのみ) >>%LOGFULLPATH%
echo $Title2F$ $Title2$と同内容でファイル名に使用できない記号が存在した場合全角に変換するもの(バッチのみ) >>%LOGFULLPATH%

echo $AddKey$ EPG自動予約で登録されたキーワード(バッチのみ) >>%LOGFULLPATH%
echo ---- >>%LOGFULLPATH%

:end
endlocal


——–
■ powershell scriptですん
—-RecAfterTSRename.ps1—-

#
#edcb rename script [RecAfterTSRename.ps1]
#
#EpgDataCapBon フォルダに RecAfterTSRename.batとRecAfterTSRename.ps1(powershell script)の2つを置いてください
#DOSバッチで全角文字の処理とか複雑なのでPowershellに投げました(負けました)
#今日初めて触って、ネットから拾ったつぎはぎなんで、おかしいところは直して使ってね!
#

# ——————————————————————
# バッチファイルから呼び出される側のパワーシェルファイルです。
# 引数 %TSNAME% %RECPATH% %RECTIME% %RECTXT% %RECNAME% %LOGNAME%
# ——————————————————————
#Write-Host (‘渡された引数1個目:’ + $Args[0] +’ – %TSNAME%’)
#Write-Host (‘渡された引数2個目:’ + $Args[1] +’ – %RECPATH%’)
#Write-Host (‘渡された引数3個目:’ + $Args[2] +’ – %RECTIME%’)
#Write-Host (‘渡された引数4個目:’ + $Args[3] +’ – %RECTXT%’)
#Write-Host (‘渡された引数5個目:’ + $Args[4] +’ – %RECNAME%’)
#Write-Host (‘渡された引数6個目:’ + $Args[5] +’ – %LOGNAME%’)
$rec_ts=$Args[0]
$rec_path=$Args[1]
$rec_time=$Args[2]
$rec_txt=$Args[3]
$rec_name=$Args[4]
$log_name=$Args[5]
$rec_title=”

# ——————————————————————
# 関数名 : WriteLog
# 処理 : 日時を付与してメッセージを標準出力する。
# 引数 : 第1引数 – メッセージ
# ——————————————————————
function WriteLog([string] $msg) {

$now = Get-Date -Format “yyyy/MM/dd HH:mm:ss”
$message = “$now $msg”

Write-Host $message

# 6番目の引数がないときはログを出力しない
if($log_name -ne $null) {
# ログファイルに出力
Write-Output $message | Out-File ${log_name} -Append -Encoding Default
}
}

# ——————————————————————
#System.IO.StreamReaderを利用した3行目だけを抽出するサンプルコード
# ——————————————————————
# .ts.program.txt が存在するかを確認: $rec_txt
$result = (Test-Path $rec_txt)
if($result){
#ファイルが存在する場合はこちらが実行されます。
#WriteLog “ファイルは存在します。: ” + $rec_txt
}else{
#ファイルが存在しない場合はこちらが実行されます。
WriteLog “(err)ファイルは存在しません。: ” + $rec_txt
exit
}

$i=1
$enc = [Text.Encoding]::GetEncoding(“Shift_JIS”)
$fh = New-Object System.IO.StreamReader($rec_txt, $enc)
while (($l = $fh.ReadLine()) -ne $null) {
if($i -eq 3) {
$rec_title=$l
}
$i++
}
$fh.Close()

if($rec_title -eq ”){
WriteLog “(err)タイトル名の取得に失敗しました。”
exit
}

# ——————————————————————
# 編集前タイトル:
# ——————————————————————
#WriteLog (‘編集前タイトル:’ + $rec_title)

# ——————————————————————
# 空白文字を削除する: $str = $str.Trim(‘  ‘)
# ——————————————————————
# 最初に全角スペースを trim します
#WriteLog (‘3行目(全角空白抜):’ + “[” + $rec_title.Trim(“ ”) + “]”)
# 次に半角スペースを trim します
#WriteLog (‘3行目(半角空白抜):’ + “[” + $rec_title.Trim(” “) + “]”)

# ——————————————————————
# 全角空白文字を半角にする: $str = $str.Replace(‘ ’, ‘ ‘)
# ——————————————————————
# ‘ ’ を ‘ ‘ に置換
$rec_title = $rec_title.Replace(‘ ’, ‘ ‘)

#(平文)
# Windowsでファイル名に使用できない禁止文字を全角に変換する
#$rec_title = $rec_title.Replace(‘\’, ‘¥’)
#$rec_title = $rec_title.Replace(‘/’, ‘/’)
#$rec_title = $rec_title.Replace(‘:’, ‘:’)
#$rec_title = $rec_title.Replace(‘*’, ‘*’)
#$rec_title = $rec_title.Replace(‘?’, ‘?’)
#$rec_title = $rec_title.Replace(‘<', '<') #$rec_title = $rec_title.Replace('>‘, ‘>’)
#$rec_title = $rec_title.Replace(‘|’, ‘|’)

#(関数)
# ——————————————————————
# Windowsでファイル名に使用できない禁止文字を全角に変換する
# 関数名:ConvertTo-UsedFileName
# 引数 :FileName ファイル名
# 戻り値:変換後のファイル名
# https://gist.github.com/ao-zkn/3e97b82a116418197d26#file-convertto-usedfilename-ps1
# ——————————————————————
function ConvertTo-UsedFileName([String]$FileName){

# 禁止文字(半角記号)
$CannotUsedFileName = “\/:*?`”><|"
# 禁止文字(全角記号)
$UsedFileName = “¥/:*?`”><|”

for ($i = 0; $i -lt $UsedFileName.Length; $i++) {
$FileName = $FileName.Replace($CannotUsedFileName[$i], $UsedFileName[$i])
}
return $FileName
}
$rec_title = ConvertTo-UsedFileName $rec_title

# ——————————————————————
# 編集後タイトル:
# ——————————————————————
#WriteLog (‘編集後タイトル:’ + $rec_title)

# ——————————————————————
# ファイル名生成
#
# 注意:既に存在するファイルの場合、Renameする処理は入れていません。
# エラーになります。
# ■■■■■■■■■■■■■■■■■■■■■■■■■■
# ■                        ■
# ■   日付と時間を足して重複しないように!    ■
# ■  (時間録画は番組名が基本的に同じなので)   ■
# ■                        ■
# ■■■■■■■■■■■■■■■■■■■■■■■■■■
# ——————————————————————
$rename_file = $rec_path + ‘\’ + $rec_title + ‘-‘ + $rec_time
$rename_ts = $rename_file + “.ts”

$rec_err = $rec_path + ‘\’ + $rec_name + “.ts.err”
$rename_err = $rename_file + “.err”
$rec_txt = $rec_path + ‘\’ + $rec_name + “.ts.program.txt”
$rename_txt = $rename_file + “.ts.program.txt”

#WriteLog (‘TS:’ + $rename_ts)

# ——————————————————————
# ファイル名変更(フルパス:Move-Item)
# 関数名:MoveTo-FileName
# 引数 :OldFileName ファイル名
# 引数 :NewFileName ファイル名
# ——————————————————————
function MoveTo-FileName([String]$MoveToOldName, [String]$MoveToNewName){
if(Test-Path $MoveToOldName){
#ファイルが存在する場合はこちらが実行されます。
try {
Move-Item $MoveToOldName $MoveToNewName
} catch {
#$error[0] | Out-String | Out-File “error.log”
WriteLog $error[0]
}

WriteLog (“Rename: ” + $MoveToNewName)
}else{
#ファイルが存在しない場合はこちらが実行されます。
WriteLog (“(err)not found: ” + $MoveToOldName)
}
}
# ——————————————————————
# ファイル名変更(ファイル名のみ:Rename-Item、パス付:Move-Item)
# ——————————————————————
# .ts
MoveTo-FileName $rec_ts $rename_ts

# .err
MoveTo-FileName $rec_err $rename_err

# .ts.program.txt
MoveTo-FileName $rec_txt $rename_txt

#WriteLog (“edcb rename script fin.”)

——–