ファイル名から日付を取り出してクリップボードにコピーするBATファイルを作る

画像ファイルをドラッグアンドドロップするだけでクリップボードに日付をコピーするBATファイルを作ってみました。

画像のファイル名に必要な日時情報が含まれること・画像のファイル名の規則性が変わらないことが条件です。

ChatGPTを使ったのですが、そこそこ苦労したので備忘録として書いていきます。

BATファイルを作成した理由

当サイトには「てがろぐ」を設置しています。

設置したときの記事はこちら↓

スクリーンショットを保存する用として使っているのですが、投稿日時は「スクリーンショットを撮影した(保存した)日時」になるように修正しています。

撮り溜めて置いたものを休みにまとめて投稿しているのですが、この『日付を修正する作業』が面倒になってきました…
(一つ一つ画像のプロパティから日時を確認して日付欄に入力していた)

ふと、ファイル名に日付情報が書いてあることに気が付き、「うまく抽出して利用できないかな~」と思い調べてみることに。

なぜBATファイルを使う発想になったかというと、以前「アプリケーションの同時立ち上げ」をする時に作っていたので、「BATファイルを使えば実現できるかも?」と思い至ったわけです。

ChatGPTに聞いてみる

準備

まずは画像ファイルを準備します。今回は、
「Screenshot_20240331-204436.jpg」
というファイル名の画像を準備しました。

画像名は規則性が有り、同じスマホでスクリーンショットを撮影すればすべてこの
「Screenshot_yyyymmdd-hhmmss.jpg」
形式で保存されます。
※ちなみに、私が使っているスマホは「Motorola edge20」です。

ここからてがろぐの日付入力欄に合うように、
「2024/03/31 20:44:36」
という形で日時を抜き出し、さらにクリップボードにコピーするようにします。

正規表現で挑戦

ChatGPTに尋ねると、

  1. クリップボードをクリアする
  2. ドラッグアンドドロップされたファイルのパスを取得
  3. ファイル名から日付を抽出するための正規表現パターン
  4. 正規表現でマッチングし、日付を抽出
  5. 抽出した日付が存在するかチェック
  6. クリップボードに日付をコピー

という手順で動くBATファイル用のコードを作ってくれました。

早速メモ帳に貼り付けて拡張子を「.bat」にし、文字コード「ANSI」で保存※。画像ファイルをBATファイルにドラッグアンドドロップし、新規メモ帳に貼り付けしてみると… 空でした💧(何も貼り付けられない)

※文字コードをANSIにしたのは途中動作確認で「echo ○○」というコマンドを使ったからです。日本語を表示させる時に文字コードがUTF-8だと文字化けしてしまったので変更しました。

うまくいかなかったのでChatGPTに何度も修正依頼したのですが、うまく動かず。どうやら3~4番目の「正規表現でマッチングし、日付を抽出」がうまくいかないようです。

本来ならここで「こういう風にコード修正してほしい」とこちらからある程度方向性を提示して修正してもらうのですが、BATファイルをこういう形で作るのは初めてでどこを修正すればいいのか・そもそもどういう動作をしているのかがよく分からず…

「BATファイルはコマンドラインのコマンドを並べたもの」らしいのですが、それ故に今までの知識だけでは難しく感じました。

○文字目を抜き出す

次に、「ファイル名の規則性が変わらず、必ず前から12文字目~26文字目に日時のデータが記載されている」という点に着目し、その部分を抜き出して必要な形に整えてもらうことにしました。

  1. クリップボードをクリアする
  2. ドラッグアンドドロップされたファイルのパスを取得
  3. ファイル名から年月日と時刻を抽出
  4. 日付と時刻をクリップボードにコピー

この手順でやっとやりたかったことが実現できました!
実際のコードはこちら↓

@echo off
setlocal EnableDelayedExpansion

REM クリップボードをクリアする
echo off | clip

REM ドラッグアンドドロップされたファイルのパスを取得
set "file=%~1"

REM ファイル名から年月日と時刻を抽出
set "filename=%~nx1"  REM ファイル名のみ取得
set "year=!filename:~11,4!"
set "month=!filename:~15,2!"
set "day=!filename:~17,2!"
set "hour=!filename:~20,2!"
set "minute=!filename:~22,2!"
set "second=!filename:~24,2!"

REM 日付と時刻をクリップボードにコピー
set "datetime=!year!/!month!/!day! !hour!:!minute!:!second!"
echo !datetime!| clip

endlocal

ファイル名「Screenshot_20240331-204436.jpg」の12文字目の数字から4文字抜き出して「year」に代入、16文字目から2文字抜き出して「month」に代入…という感じで抜き出していき、最後に
「year/month/day hour:minute:second」
という形に並べてもらいました。

なぜか「○文字目」の数字を間違えて教えられたりして微調整が大変でしたが… なんとか無事完成しました!

※コマンドラインでは1文字目を0として数えるので、12文字目は11となるはずなのですがなぜか12で教えられました。初歩的なミスだと思うのですが…

最後に

最終的に出来上がったコードは短いのですが、そこに至るまでにかなり時間がかかりました…

ChatGPTはプログラミングが得意だと思っていたのですが、コマンドラインのコマンドはプログラミング言語とはまた違うようなので、それのせいで引っかかったのかもしれません。

今回のコードは私のスマホのスクリーンショットに合わせて調整してありますが、ファイル名に規則性があれば数字を変更したりして応用できるかと思います。

これでこの件は終了!…と思っていたのですが、どうしても「正規表現」でうまくいかなかったのが気になってしまったので、これからもう少し格闘してみようと思います。

関連記事
新着記事
ブログ内検索