なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこで複数のファイル名変更をする

きっかけ

Win+Gで起動するXboxゲームバー、動画が簡単に撮れます。

Edgeの画面を撮った時に出来上がるファイルがなでしこでファイル名変更ができないので ※詳細は後述
仕方なくファイル名変更のバッチファイルの作り方を調べてみた
サンプルをコピーして、ちょっと弄れば出来上がり……

for %%F in (*.mp4) do call :sub "%%F"
goto :EOF

:sub set BEFORE=%~1 set FILENAME=%~n1 set EXTENSION=%~x1 set AFTER=%FILENAME:~-19%%EXTENSION% ren "%BEFORE%" "%AFTER%" goto :EOF

……こわい! 文法がわからずにスクリプトの一部を弄るの、こわい!
リネームの記事は文法をしっかり解説しようと思いました。

リネーム記事なんてそこらへんにあるだろう、とかもう誰かがやってるから、
…とか言わずに、解説はネットに複数存在するほうがいい。
こわいので複数見比べる必要があるからです。

みんなで二番煎じの記事、書こう!

なでしこ1でファイル名を変更する

Edgeの画面をXboxゲームバーで動画で撮ると作成されるファイル名は
ページタイトル プロファイルx Microsoft​ Edge 日付・時間.mp4 となります
今回はここから日付と時間だけにします。
テストでとった検索結果を適当に動画ファイルに。

・変更前のファイル名
なでしこ ファイル名変更 - 検索 - プロファイル 1 - Microsoft​ Edge 2022-02-28 16-19-48.mp4

・変更後のファイル名
2022-02-28 16-19-48.mp4

・なでしこのプログラム

作業フォルダ「C:\Users\ユーザー名\Videos\Captures\」

変更前とは変数 
変更後とは変数 
拡張子とは変数
ファイル名とは変数

「*.mp4」ファイル列挙
それ反復
  変更前対象
  拡張子対象から拡張子抽出
  
  対象拡張子変更
  ファイル名それから19文字右部分
  変更後ファイル名拡張子
  デバッグ
  //変更前から変更後へファイル名変更

おわり

それというのはなでしこの変数で、命令の戻り値がそれに入ります。
対象もなでしこの変数で、反復とセットで使います。
対象には反復する配列の一要素が入ります。

なでしこではインデント(行頭の全角スペース)が必須で、文法上の意味があります。
反復はループの命令で、インデントが下がるところまで行ったらループの開始に戻ります。

続いて、一行ごとの解説

作業フォルダ「C:\Users\ユーザー名\Videos\Captures\」

 作業フォルダを指定すると相対パスでファイルの操作ができます。

~~とは変数

 変数の宣言です。 変数宣言は省略しても大丈夫です。
 このプログラムでは変更前、変更後、拡張子、ファイル名がユーザー定義の変数です。

~~ファイル列挙

 ファイル列挙はファイル名を配列で返します。
 作業フォルダにあるファイル名を配列にしてそれに返します。

それ反復

 配列を使ってループを形成します。
 配列の要素を一つずつ取り出しながら繰り返します。
 ループに入るとき、取り出した要素は変数対象に入ります。

変更前対象

 助詞「は」は変数への代入です。 一般的なプログラム言語の=に当たります。

拡張子対象から拡張子抽出

 助詞「は」は代入なので、「対象から拡張子抽出」の結果が入ります。
 拡張子抽出は命令です。
 「ファイル名.mp4」から拡張子抽出であれば「.mp4」の4文字が入ります。
 なでしこでは拡張子は「.」を含みます。

対象拡張子変更

 拡張子変更は実際のファイル名を操作するわけではなく、ファイル名とする文字列を作る命令です。
 「ファイル名.mp4」を空(から)に拡張子変更であれば、「.mp4」が空になって「ファイル名」が返ります。

ファイル名それから19文字右部分

 文字右部分という命令があります。
 文字左部分という命令もあるので、アレンジする場合はお好みで。
 今回のサンプルでは「2022-02-28 16-19-48」の部分が19文字右部分です。

デバッグ

 デバッグウィンドウが開く命令です。
 変数の中身がわかるので、変数「変更後」に何が入っているか確認します。

//変更前から変更後へファイル名変更

 //で始まる行はコメントです。実行されません。
 こわいのでまずはコメントアウトして実行します。
 上記のデバッグで変数が思った通りの内容になっていたら//を消し、デバッグのほうに//をつけます。
 ファイル名変更は命令です。  ファイル名が変わります。

おわり

 おわりは命令です(文法ではない)
 なでしこのウィンドウが閉じます。

続いてデバッグウィンドウ

f:id:tkizzz:20220228175139p:plain
デバッグウィンドウ

デバッグウィンドウはこんな感じ
変数「変更前」「変更後」が思った通りになっていたらコメントを外して再度実行します。

なぜファイル名変更できない動画ファイルができたか

サンプルのmp4はEdgeで起動したブラウザゲーの画面を動画にしたものです。
デバッグウィンドウの変更前…Microsoft? Edge 2022-02-28 16-19-48.mp4となっているのがわかるでしょうか。
間に?が混じってますね。

f:id:tkizzz:20220228175333p:plain
エクスプローラ上ではそんなものはない。

正体は…ゼロ幅スペース
なでしこは内部でSJISで処理しているので、unicodeの文字列処理には弱い。
こいつのせいでなでしこではリネームできなかったという話でした。

おまけ

Edgeには「名前とウィンドウ」というメニューからウィンドウに名前を付けるという機能があります。
これでウィンドウタイトルを変えてからXboxゲームバーで動画をとればゼロ幅スペースのない動画が撮れます。