Windowsでファイル名に更新日時を追加する処理を右クリックからするやつ（Windows10 / 11）

とても頭が悪そうなタイトル（小並感）

# やりたいこと
- Windowsのエクスプローラでファイルを右クリックしたら出てくるやつ（コンテキストメニュー）から、1クリックでファイル名に更新日時をつけたい
    - 右クリックしたらこんなの↓が出てきて、これをクリックしたらファイル名が勝手に変わる
      ![コンテキストメニュー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/f8a470e3-4856-b6fe-8741-403131b6c371.png)
    - MacだとAutomatorとかいう神アプリで難なくできるけど、Windowsだとそんなアプリない（あったら教えてください）
    - batファイル作ってファイルをD&Dするのは、いちいちbatファイルがあるフォルダを開かないといけないから面倒


どこかに右クリックから1クリックで更新日時つけてファイル名変えてくれるアプリねぇかなあああああ

……

よし、自分でつくろう！

# できたもの
![できたもの動画](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/090f942e-5c7d-3224-e011-fd2af4f52aa9.gif)

# 環境
- Windows 10 Pro
    - Windows 11 Proでもできなくはないが、ここでの説明は概ねWindows 10での話
    - Windows 11については[ここ](#windows-11への-恨み節-対処)を参照

# 用意するもの
- テキストエディタ

# 作業手順
## 1. バッチファイルを作る

とりあえず、ファイル入力を受けてファイル名に更新日時をつけてくれるバッチファイルを作ります。

```bat:addUpdateDate.bat
@echo off

rem =====(1)=====
rem コマンドプロンプトのウィンドウを最小化した状態で再帰呼び出し
@if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof

rem エラー処理：引数がない場合は終了する
if "%~1"=="" (
  exit /b
)

rem =====(2)=====
rem ファイルの更新日時を取得する。フォーマットは YYYY/MM/DD HH:MM
set str_datetime=%~t1

rem 取得した更新日時から余計な記号を消して、ファイル名につける形にする
rem まずは / を削除
set str_datetime=%str_datetime:/=%

rem 次に : を削除
set str_datetime=%str_datetime::=%

rem 最後に半角スペースを - に変更
set str_datetime=%str_datetime: =-%

rem ここまでで、str_datetime に YYYYMMDD-HHMM というフォーマットで数字が代入された

rem =====(3)=====
rem 変更前のファイルのフルパスを取得（例：C:\...\hoge\fuga.txt）
set str_oldfile=%~1

rem ファイル名（fuga）を str_new_fn に、拡張子（.txt）を str_new_ex にそれぞれ代入
set str_new_fn=%~n1
set str_new_ex=%~x1

rem 更新後のファイル名を str_newfile に代入。フォーマットは [str_new_fn]_[str_datetime][str_new_ex]（fuga_YYYYMMDD-HHMM.txt）
set str_newfile=%str_new_fn%_%str_datetime%%str_new_ex%

rem ==========
rem ファイルをそのままリネームする場合はAを、ファイルをコピーした上でリネームする場合はBを記述
rem ==========

rem A. 指定したファイル名 str_newfile に変更
ren "%str_oldfile%" "%str_newfile%"

rem B. 指定したファイル名 str_newfile としてコピーを保存
copy "%str_oldfile%" "%str_newfile%"
```

~~参考に~~ 丸パクリしました：

https://qiita.com/koiwaiwaiko/items/2715251fce0c5f529429

### コードの内容
(1) は、バッチ処理時に一瞬だけ画面に出てくるコマンドプロンプトの画面がどうしても許せなかったので、それを非表示にするためのコードです。
タスクバーに出現することは止められませんが、あの黒い画面が一瞬でも出現することはなくなったので精神衛生的にかなりいいです。

~~参考に~~ 丸パクリしました：

https://nllllll.com/windows/windows-bat-minimize/

(2) でファイル名やら更新日時やらを取得しています。
最初、更新日時を取得したあと文字の切り出しで年月日などを取得しようと思いましたが、 ~~参考元~~ 丸パクリ元がとても綺麗な置換をされていたので ~~参考に~~ 丸パクリしました。

(3) でファイル名置換のための処理を行っています。ここは特に言うことはありません。

一応この時点で、作成した `addUpdateDate.bat` にファイルをD&Dすれば、ファイル名に更新日時をつけるという挙動をします。
「右クリックなんてﾌﾖｳﾗ！」という方はここで終了です。お疲れ様でした。

## 2. バッチファイルを右クリックで呼び出せるようにする

ここからWindowsの火薬庫、レジストリエディタを使用します。
例に漏れず **自己責任** で頑張りましょう。

### 2-1. レジストリエディタを起動する

Windowsメニューから「レジストリ エディター」と検索すれば出てきます。
もちろん、Win+Rキーで「ファイル名を指定して実行」を呼び出して`regedit`でも構いません。

### 2-2. 右クリックを司るレジストリキーに、バッチファイルを呼び出すコンテキストメニューを追加する

ファイルを右クリックして表示されるコンテキストメニューは、`コンピューター\HKEY_CLASSES_ROOT\*\shell`で設定します。
![レジストリエディタ1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/3d57e115-39c3-e889-3759-8d2b204d6678.png)

参考にしました：

https://ascii.jp/elem/000/000/953/953807/

この`shell`に新しいキーを追加します。
![レジストリエディタ2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/d270bd5b-8daa-6795-6d74-759fa54f2bbf.png)

ここでは、キーの名前を`addUpdateDate`としました。 ~~安直~~
![レジストリエディタ3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/cba80837-dabb-9531-55cb-23d29d19a8d4.png)

このキーの直下に、さらに新しいキー`command`を作成します。名前は`command`から変えてはいけません。
![レジストリエディタ4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/06599ae0-69d9-4fea-0248-1b29d67fae09.png)

このキーの中にある`(規定)`を編集し、次のように値のデータを設定します。
`"[addUpdateDate.batのフルパス]" "%V"`（例えば`"C:\...\hoge\addUpdateDate.bat" "%V"`）
![レジストリエディタ5](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/88670d66-dbeb-930a-48b1-9be7257e7f2e.png)


これで、ファイルを右クリックしたときに`addUpdateDate`というコンテキストメニューが表示されます。
~~参考に~~ 丸パクリしました：

https://qiita.com/NumLocker/items/f8016f1aed7207b850fb

コンテキストメニューの名前を変えたい場合は、`addUpdateDate`というキーの名前を変えるか、このキーの中の`(規定)`を編集し、任意の文字列にします。
例えば以下の画像のようにすると、コンテキストメニューには`ファイル名に更新日時を追加(U)`と表示されるようになります。

:::note
最後に`(&[キー])`と書くことで、そのキーをショートカットキーとして指定できます。
:::
![レジストリエディタ6](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/a7ccb9e7-5484-3c39-8764-bc3386cd6665.png)


これで「**Windowsでファイル名に更新日時を追加する処理を右クリックからするやつ**」の完成です！

……が、もう少しいじってみます。

## 3. （オマケ）コンテキストメニューの位置とアイコンを指定する

### 3-1. コンテキストメニューの位置を指定する

コンテキストメニューで今回の`ファイル名に更新日時を追加(U)`が表示される位置は、概ねレジストリエディタで指定ができます。
`addUpdateDate`キー内に新たに`文字列値`を指定し、名前を`Position`（変えちゃダメ）、データを`Top`、`Middle`、`Bottom`のいずれか（これも変えちゃダメ）に指定しましょう。
だいたい「上ほど」「中ほど」「下ほど」に`ファイル名に更新日時を追加(U)`が表示されます（上のGif画像では`Bottom`と指定しています）

![レジストリエディタ7](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/f909a973-150d-c913-ee4d-76d1b41992a2.png)

参考にしました：

http://blog.hushlogue.com/?eid=810075

### 3-2. コンテキストメニューのアイコンを指定する

アイコンはWindows標準のアイコンを指定する方法があるのですが、 ~~面倒~~ 超面倒なので自前で用意します。
自前と言っても、フリーで使わせてくれるアイコン屋さんを利用します。
私はここを利用しました：

https://icooon-mono.com/

背景を透過できるpngファイルをico形式に変換すればOKです。
サイズは適当で構いません。コンテキストメニュー上ではいい感じのサイズ感で表示してくれます。
一番最初に出した画像 ![コンテキストメニュー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/f8a470e3-4856-b6fe-8741-403131b6c371.png) では128 x 128pxのico画像を利用しています。正直そんなに大きくなくてもいいと思います。

png形式をico形式にする方法ですが、掃いて捨てるほどpng->ico変換してくれるWebサイトがあるのでそれを利用すると良いでしょう。
適当に「png ico 変換」とかググれば出てきます。
自前でできるならそれでも可。

用意したアイコンを読み込むには、位置を指定したときと同様に、レジストリエディタの`addUpdateDate`キー内で、新たに`文字列値`を指定し、名前を`Icon`（変えちゃダメ）、データをico画像のフルパスを指定します。フルパスを指定するときはダブルクォーテーション`" "`で囲んであげたほうが安心。

:::note warn
アイコンを指定したとき、一度icoファイルが読み込まれるとどこかのキャッシュに保存されるらしく、同じ名前でico画像を変えても読み込み直ししてくれません。
その場合はファイル名を変更するか、PCを再起動してキャッシュを消すと良いでしょう。
（本当はキャッシュをピンポイントで削除できればよかったけれど、その方法が分からなかった……）
:::

### まとめると
コンテキストメニューの位置とアイコンを指定するとこんな↓感じになります。
![レジストリエディタ8](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/e50178da-0685-7c96-7893-30196d2f277a.png)

# Windows 11への ~~恨み節~~ 対処
Windows 11がこんなに使い勝手が悪いとは思いませんでした（半ギレ）

## コンテキストメニューは1階層潜る必要がある
画像のとおりです。
1回「その他のオプションを表示」をクリックして、Windows 10以前の、従来のコンテキストメニューを開かないと出てきません。
じゃあ最初のコンテキストメニューに表示させる方法は？って話なんですが、レジストリエディタで弄れるほど簡単な設定ではないようです。
![Windows 11-1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/685f902f-023b-dcc5-76e2-02271b2a023b.png)

海外の情報共有サイトでも匙が投げられていました：

https://superuser.com/questions/1711597/adding-custom-commands-on-the-windows-11-right-click-menu?rq=1

本当はしたくなかったのですが、しょうがないのでレジストリエディタを弄ってくれるソフトを導入しました：

https://apps.microsoft.com/store/detail/custom-context-menu/9PC7BZZ28G0X

120円ですが、無期限で無料試用可能なんだそうです。作者サポートをしたい方はお金払いましょう。

設定はあまり難しくありません。説明は他サイトに譲ります。例えば↓：

https://www.teradas.net/archives/43675/

ちなみに私の設定はこんな感じです。ちなみにレジストリエディタを直接弄る際には利用できたショートカットキーの設定はできません。
![custom context menu](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/ad0c0f29-0cb1-37f0-f32f-d07329b9043b.png)

これで1回目のコンテキストメニューに`ファイル名に更新日時を追加`が表示されます。![Windows 11-2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/a6ad95eb-e07a-6227-e046-b51f752eee78.png)

:::note warn
うまく行かない人は左下の「Cache」をOnにしてみるといいかもしれません。
:::

ちなみに、巷では1回目の右クリックで表示されるコンテキストメニューをWindows 10のように戻す方法も数多く挙げられていますが、個人的にはWindows 11のスッキリとしたメニューが好きなので、その方法は採っていません。

## `start \min cmd` が効かない
バッチファイルの(1)で利用した、コマンドプロンプトを最小化した処理ですが、Windows 11では通用しません。
つまり実行のたびにあの黒い画面が一瞬表示されます。 ~~ウザい~~


# おしまい！
久々にまともなネタを書いた気がします（ただの備忘録）。
しかしWindows 11は細かいところの設定が効きませんね。 ~~まるでMacのよう。~~
まぁMicrosoft側からしたら下手にカスタマイズされるのも面白くないんでしょうけれど。
~~いいから早くタスクバーを画面左右とか上に固定できるようにしろ。~~

というわけで、【Windowsでファイル名に更新日時を追加する処理を右クリックからするやつ】でした。
「そんなん知っとるわボケ」とか「Qiitaに書くようなことじゃねえよ帰れ」とかいうのは……どうか心の内におしまいください。