カテゴリー
wsh-jscript

AviUtlのシーンチェンジを一括設定【ゆっくり解説】

AviUtl のシーンチェンジを一括設定するスクリプトを作ってみました。
この動画のスクリプトはWindows11で作成してます。

MS-DOSバッチなのでadd_scene_change.batという名前で保存してください。

@if(0)==(0) ECHO OFF
:カレントDIRをこのバッチが置かれたDIRに変更
cd /d %~dp0
%SystemRoot%\SysWOW64\cscript.exe //nologo //E:JScript "%~f0" %*
GOTO :EOF
@end

//  パラメーター
// 入力exoファイル(拡張子は小文字でexo)
exofilename="test.exo"

//画像があるレイヤー
layer1=2

//シーンチェンジをつけるレイヤー
layer2=4


var objShell = WScript.CreateObject("WScript.shell");
var fso      = WScript.CreateObject("Scripting.FileSystemObject");


var ifile = fso.OpenTextFile( fso.BuildPath(objShell.CurrentDirectory,exofilename) );
var ofile = fso.OpenTextFile( fso.BuildPath(objShell.CurrentDirectory,exofilename.replace(".exo","_update.exo")),2,true );
var str = ifile.ReadAll();

//  入力ファイルを閉じる
ifile.Close();
//  出力ファイルの書き出し
ofile.Write(str);

//シーンチェンジを挿入するフレーム位置を格納する配列
var cc_point = [];
//[文字列]で始まり次の[が来るまでの文字列を取得
//var res1 = str.match(/^\[.*\][^\[]*/mg);
var res1 = str.match(/^\[.*(?:\n(?!\[).*)*\n*/gm);
for (i = 0; i < res1.length; i++)
{
	//オブジェクトを改行コードで分割
	res2 = res1[i].split("\n")
	var obj = {};
	for (j = 0; j < res2.length; j++) {
		if (res2[j].length>2) {
			//オブジェクトの情報を連想配列にする
			res3 = res2[j].split("=")
			if (res3.length==2) {
				obj[res3[0]]=res3[1]
			}
			if (res3.length==1) {
				res4 = res2[j].match(/\[(.*)\]/)
				if (res4.length > 0) {
					//[数字]の数字を取ってくる
					x_idx=Number(res4[1])
				}
			}
		}
	}
	if (obj["layer"] == layer1 ) {

		x_len=obj["end"] - obj["start"]

		//3秒以上ならシーンチェンジを追加する
		if (obj["start"]>1 && x_len > 3*60) {
			WScript.Echo( res1[i] );
			cc_point.push(obj["start"]+0)
		}
	}
}


for (i = 0; i < cc_point.length; i++) {
	x_idx = parseInt(x_idx) + 1
	/*	
	付け加えるシーンチェンジのサンプル

	[106]
	start=1005
	end=1064
	layer=2
	[106.0]
	_name=シーンチェンジ
	調整=0.00
	track1=0.00
	反転=0
	check0=0
	type=0
	filter=0
	name=
	param=*
	*/	

	x_start=parseInt(cc_point[i])
	
	ofile.Writeline("["+x_idx+"]");
	ofile.Writeline("start="+x_start);
	ofile.Writeline("end="+(x_start+60));
	ofile.Writeline("layer=" + layer2);

	ofile.Writeline("["+x_idx+".0]");
	ofile.Writeline("_name=シーンチェンジ");
	ofile.Writeline("調整=0.00");
	ofile.Writeline("track1=0.00");
	ofile.Writeline("反転=0");
	ofile.Writeline("check0=0");
	ofile.Writeline("type=0");
	ofile.Writeline("filter=0");
	ofile.Writeline("name=");
	ofile.Writeline("param=*");
	
}

ofile.Close()
WScript.Echo( "Saved ", fso.BuildPath(objShell.CurrentDirectory,exofilename.replace(".exo","_update.exo")) );

カテゴリー
wsh-jscript

VBA100本ノックの100本目をやってみた

VBA100本ノックの100本目をやってみた。

VBAで作ったみた。
Sub Macro1()
    'IEを起動する
    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorer
    'IEの位置・大きさの設定、IEを表示
    objIE.Top = 10: objIE.Left = 6160: objIE.Width = 800: objIE.Height = 900
    objIE.Visible = True
    
    objIE.Navigate "https://excel-ubara.com/vba100sample/vba100list.html"
    Call untilReady(objIE)
    'VBA100本ノック目次のtableをとってくる
    Set objTable = objIE.Document.getElementsBytagname("table")
    x_html = objTable(0).outerHTML
    'IEを閉じる
    objIE.Quit
    Set objIE = Nothing
    
    'クリップボードにコピー
    Dim CB As New DataObject
    CB.SetText x_html
    CB.PutInClipboard
    'Sheet1にペーストする
    Set oSheet = ThisWorkbook.Worksheets(1)
    oSheet.Range("A1").PasteSpecial Paste
End Sub
Sub untilReady(objIE As Object)
    Do While objIE.Busy = True Or objIE.ReadyState <> 4
        DoEvents
    Loop
End Sub

DOSバッチ・VBScriptで作ったみた。
<!-- :
@%windir%\System32\cscript.exe //nologo "%~f0?.wsf"
@exit /b %errorlevel%
-->
<job>
<script language="VBScript">
	'このファイルのあるディレクトリをカレントディレクトリに
	Set objShell = Wscript.CreateObject("WScript.shell")
	Set fso      = Wscript.CreateObject("Scripting.FileSystemObject")
	CurrentDirectory = fso.getParentFolderName(WScript.ScriptFullName)

	'IEを起動する
	Dim objIE
	Set objIE = WScript.CreateObject("InternetExplorer.Application")

	'IEの位置・大きさの設定、IEを表示
	objIE.Top = 10: objIE.Left = 6160: objIE.Width = 800: objIE.Height = 900
	objIE.Visible = True

	objIE.Navigate "https://excel-ubara.com/vba100sample/vba100list.html"
	Call untilReady(objIE)
	'VBA100本ノック目次のtableをとってくる
	Set objTable = objIE.Document.getElementsBytagname("table")
	x_html = objTable(0).outerHTML
	'IEを閉じる
	objIE.Quit
	Set objIE = Nothing

	'クリップボードにコピー
	objShell.Exec("clip").StdIn.Write x_html

	'Excel起動
	Set oXlsApp = WScript.CreateObject("Excel.Application")
	'Excelの位置・大きさの設定、Excelを表示
	oXlsApp.Top = 10: oXlsApp.Left = 4460: oXlsApp.Width = 600: oXlsApp.Height = 400
	oXlsApp.Visible = True

	'新規にブックを作成
	Set objWorkbook = oXlsApp.Workbooks.Add
	'Sheet1にペーストする
	Set oSheet = objWorkbook.Worksheets(1)
	oSheet.Range("A1").PasteSpecial Paste
	
	'ブックを名前をつけて保存
	oXlsApp.DisplayAlerts = False
	objWorkbook.SaveAs(fso.BuildPath(CurrentDirectory,"test.xlsx"))
	oXlsApp.DisplayAlerts = True

	'Excelを閉じる
	oXlsApp.Quit
	Set oXlsApp = Nothing


Sub untilReady(objIE)
	'IEがページをロードし終えるのを待つ
	Do While objIE.Busy = True Or objIE.ReadyState <> 4
	WScript.Sleep 1000
	Loop
End Sub

</script>
</job>