複数のbatファイル

call ???.bat
として、複数のバッチファイルを呼び込んで、また帰ってくる。
「帰ってくる」とは、元のaaa.batからbb.bat,cc.bat,dd.batを呼び出して元のaaa.batに戻る。

aaa.batの中身。

@echo aaa
call bb.bat
call cc.bat
call dd.bat
echo aaa

bb.batの中身

@echo bb

㏄.batの中身

echo cc

dd.batの中身

echo dd

aaa.bat実行の様子。echoで@echoにするとechoコマンドの行が見えません。

C:\Users\take2\tmp>aaa
aaa
C:\Users\take2\tmp>call bb.bat
bb

C:\Users\take2\tmp>call cc.bat

C:\Users\take2\tmp>echo cc
cc

C:\Users\take2\tmp>call dd.bat

C:\Users\take2\tmp>echo dd
dd

C:\Users\take2\tmp>echo aaa
aaa

コマンドでユーザー切り替え

WindowsでShutDown /fコマンドならログオフ。
ユーザー切り替えは、以下のコマンドだ。見た目はログオフ。Windows10でも確認済み。
rundll32.exe user32.dll,LockWorkStation

こちらの情報です。m(_ _)m。

コマンドプロンプトに直接入力しても実行できる。

コマンドプロンプトは、Windowsキーを押しながらRキーを押して「ファイル名を指定して実行」を開き、 「cmd」と入力し、Enterキーを押すと、コマンドプロンプトが起動します。

ちょっと席を外す時、セキュリティのために画面を閉じたい。
マウス操作なら3回クリック。コマンドならショートカットで一発。
Ctrl+Alt+zで片手一発。Windowsキー+Lでも同じことができるが、両手。
このショートカットのファイルをディスクトップに置く。

rundll32.exe user32.dll,LockWorkStationをu.batに書いて。u.batのショートカットを作る。
そして、次図みたいにショートカットにショートカットキーを割り当てる。

ログオフShutDown /fだとユーザー名も入力が必要(設定による)だし、使っているアプリをすべて閉じる必要がある。Alt+F4連続もね。ちょっと席を外すだけなのに続きの仕事はできない。

Ctrl+Alt+zは何をしたのか通常の人はわからない。

だから、Lineとか見てて隠す、さらに、終了させておくこともできる。

u.bat

taskkill /f /im LINE.exeを先頭に入れるとLineが強制終了後にユーザー切り替えになる。

Excel外部リンクの探し方

ファイルを開いたタイミングで別のファイルとのリンクを更新するか問われることがある。

実は外部のワークブックの参照は2つある。

  1. 外部リンク(ファイルを開くタイミングでわかる)
  2. 名前

外部リンクに関してはマイクロソフトの参考サイトがある。Ctrl+fでブック単位で.xlを検索。
名前は盲点だ。
名前は、他のワークブックからコピーのタイミングで名前が作られる。これが盲点。
次図は、セルA1の名前だけ。外部のファイルの名前ではない。外部かどうかは参照範囲でわかる。数式タブに「名前の管理」がある。

A1
のセルを別のワークブックにコピーすると、別のワークブックには「あいうえお」の名前がコピーされる。

開発時は参照設定と運用時はCreateObject関数

オブジェクトのインスタンスを作る時。

開発時は、参照設定でNewキーワード。ディバッグ時に型が特定されているのでメンバーの参照ができて楽。

運用時は、バージョン違いでも動くようにCreateObject関数を使う。

動画の分割や変換、結合コマンド 、高速再生、音声追加、ffmpeg.exe

マウス操作よりコマンドラインで操作の方が簡単
と思う。
分割や変換できるソフトをインストールして使うと
使い方はマウス操作だから変化を見ながら操作する
ヘルプを見ない質なのでしかたないが、難しい。
また、インストールしたアプリ名と分割や変換の機能があるかどうか連想できないのも問題だ。
つまり、
コマンドラインでの入力の方が慣れている世代なのです。

もともと、EverNoteに動画を置くのにサイズの問題があった。有料でも200MBまで。分割できるのだが、ffmpeg -i org.mp4 new.mp4とするだけでnewの方が半分になるので使っていた。

インストールというかファイルを取ってくる

さて、ffmpeg.exeはここから手に入れる。
https://www.ffmpeg.org/
手順は、以下。

  1. ダウンロードの英語(次図は翻訳)の文字画像をクリック
  2. ウインドウのマーク、画像(文字でない)をクリック
  3. ここでは下側の「BtbN」をクリック

令和6年1月11日時点

(tar.bz2?実際ダウンロードファイルはzipだった)
zipファイルを解凍するとbinフォルダに3つのファイルがある。

ffmpeg-master-最新-win64-gpl.zipを選ぶ。解凍してbinフォルダに以下の3つがあればok。このffmpeg.exeファイルはサイズは大きいがこの


.DLLの拡張子のファイルが別に必要な「Linking」とか「Shared」ではなく、Staticを選択する。Static付きのファイルが無かったらShared無しを選ぶ。

解凍した状態で以下のようにLibフォルダがあり、.DLLなどがいっぱいあるならffmpeg.exe単体では動かない。

以下のようにLibフォルダがあるとffmpeg.exeの他に必要なDLLもコピーする必要がある。ffmpeg.exeファイルのサイズは、200kB以下と小さいのでffmpeg.exe単体では動かない。

以下ならコピーするファイルが多くなる。ファイル名にsharedって付いてます。

\は¥のこと
ffmpeg.exeをc:\windowsフォルダに入れておくとどのフォルダからも実行できるが、削除したくてもどれかわからなくなる。
とりあえず、自分しか使わないから以下に置く。
C:\Users\take\

以下は使い方。
一度ffmpegを実行すると圧縮されるようだ。時間を指定するので一度ffmpegを実行する。
開始時間0秒から最後までa.mp4をb.mp4に出力する。

C:\Users\take>ffmpeg.exe -ss 0 -i a.mp4 b.mp4

C:\Users\take>ffmpeg.exe -ss 0 -i 入力ファイル  出力ファイル

分割

分割スタート(-ss 10)から1分(-t 60)まで。-tは-sの開始からどれだけ記録するか時間を入れる。-iで元の動画。出力先の動画は最後。50秒の動画ができます。

C:\Users\take>ffmpeg.exe -ss 10 -i 0.mp4 -t 60 1.mp4
 
-tは終了時間をメモしてスタート時間から引き算しないといけまえん。2回ffmpegを実行する必要はあるが、-to 00:01:25だと始めから1分25秒までの動画ができますので、もう一度-tを省略して-ss 00:00:10とすると開始10秒まえをカットした動画が得られます。
 
分割:1分から最後まで -tは無し。最後まで
C:\Users\take>ffmpeg.exe -ss 60 -i 0.mp4  2.mp4
.mp4ファイルのファイル名は、日本語は化けたりしてコマンド自体実行できなかったりなので適当な数字の名前0.mp4とか1.mp4などにしている。
変換:mp4からaviへ
C:\Users\take>ffmpeg.exe -i 0.mp4 0.avi
拡張子を変えるだけ。
 
C:\Users\take>ffmpeg -ss 開始秒 -i 入力ファイル -t 長さ(秒) 出力ファイル
 
-iの秒の開始を5分後とする場合は00:05:00が使える。-tの長さも2分なら00:02:00と書ける。
C:\Users\take>ffmpeg.exe -ss 00:05:00 -i 0.mp4 -t 00:02:00 1.mp4
それにしても、先に1度だけffmpegを実行して圧縮してから時間は決めた方がいい。

AviUtlでファイルを結合/追加読み込みすると「映像の音ズレ」をおこすことがある。解決策はいろいろあるようだがこのコマンドを使うのが簡単。

結合

結合したいファイルが1.mp4、次に2.mp4の順。以下のテキストファイルを作る。これ作らない方法は見つからない。

file 1.mp4
file 2.mp4

C:\Users\take>ffmpeg -f concat -i a.txt -c copy out.mp4

動画の種類を変える

エンコーダ、動画の種類を変えるのは、拡張子を指定するだけ。

ffmpeg -i aa.avi aa.mp4

VOBファイルもできる。変換ツールを求めて色々インストールする必要はありません。「vob mp4 変換」って検索してもffmpegはなかなか出ません。「動画変換フリーソフト」では何とか見つかるかどうかです。

スピードを早く、遅く

スピードを早くしたり、遅くしたり。ここでは1.5倍速の例

ffmpeg -i src.mp4 -vf setpts=PTS/1.5 -af atempo=1.5 dest.mp4

1.5を0.8にすれば遅くなる。

音声の追加はこちら(m(__)m)にあります。in.m4aが音声です。

ffmpeg -i in.mp4 -i in.m4a -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4

ほんま何でもできるんね。上下、左右反転回転もね。

エクセルを使った一括処理例

settimer() killtimer() WindowsAPIである時間にWindowsがVBAの関数(TimerProc)を呼び出す

ExcelのVBAでもWordのVBAでもできます。

以下を標準モジュールに書く。

Option Explicit

#If VBA7 And Win64 Then
'64bit版
   Private Declare PtrSafe Function SetTimer Lib "user32" _
   (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As LongPtr
#Else
 '32bit版
  Private Declare Function SetTimer Lib "user32" _
  (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
#End If
#If VBA7 And Win64 Then
 '64bit版
  Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
 '32bit版
  Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
#End If

'Windowsが呼び出す関数。引数や戻り値は決まっている。TimerProcで検索すると見つかる
Public Sub TimerProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal TimerID As Long, ByVal TickCount As Long)
  Debug.Print hwnd, Msg, TimerID, TickCount
  KillTimer 0, TimerID 'タイマーを止める。Windowsに教える。
'ここにやりたことを書く
End Sub

Sub main()
  SetTimer 0, 0, 1000 * 2, AddressOf TimerProc '1000で1秒。2秒後にTimeProcを呼び出す
End Sub

二秒後にイミディエイトウィンドウに出力する。イミディエイトは下の方の図の下の方。

もし、二秒にしたいならTimeProc関数のKillTimerの行をコメントアウトか削除する。

1列目はウィンドウハンドル、2列目は275はWM_TIMER = &H113 のこと。3列目は、タイマーID。4列目はWindowsの起動からの経過時間(ミリ秒単位)

これやって何がうれしいのかというと、一定時間後に実行する関数が作れる。
呼び出しを実行するのはWindowsのOS。だからVBAのリソースは使わない。Excelのプロセスとは違う。WordとExcelが動いていて、Wordが固まってもExcelまで影響を受けないのと同じ。ただし、WordとExcel間で通信?していると少し違うが、基本的にWordを閉じたらExcelは普通に使える。これはWindowsOSとExcel間でも同じです。ただ、WordとExcelは同等のアプリですが、WindowsとExcelはWindows管理下にある。このイメージ、メモリ空間かな。常にWindowsは動いている。「windows メモり 空間  64」で検索するといろいろ図が見えるが、仮想のメモリ状態、物理的/実際のメモりアドレスはありません。仮想のメモリ上は常にOS(Windows)が常駐してアプリが切り替わる。

で、

一定時間後に実行する関数は、TimerProc関数。
TimerProcの関数名はaaa関数でも何でもいいが、戻り値や引数の数、型は決まっている。

だって、

Windowsが呼び出すのでその決まり引数の数や型、順番も、あとは戻り値の型に従う。WindowsがExcelのプロセスの関数を呼び出す。
TimerProcの関数名をSettimerの第四引数に指定。
関数名を渡すのではなく、関数があるアドレスを渡すためAddressOf演算子を使う(メモリ上のアドレス/番地を渡すので関数名は関係ない。だからaaa関数でもいい)。

ExcelWordのApplication.OnTimeと同等のことができる。こっちは時間の間隔では無く実行する時間を指定する。5秒後にするには「今の時間+5分」。VBAのコードならNow() + TimeValue(“0:0:5”)。