(AutoHotkey)(ファイル名の末尾に 最終更新日 を添付したバックアップファイルを作成するツールを作ってみる 編)

 このツールは 二つの方法での使い方が出来ます
一つは、 スクリプトをダブルクリックし GUIを表示させます、 その GUIに ファイルを D&D します
もう一つは デスクトップに スクリプトを コピーするか ショートカットを作り 、 そのアイコンに D&D します
その時々に応じて 使い分けることが出来ます

 アイコンへのD&Dの場合は ファイル名は コマンドライン引数として渡されます
GUIへのD&Dの場合は GuiDropFiles という サブルーチンが自動的に呼び出されます

 アイコンに対して D&D する場合は
AutohotKeyのインストール時に スクリプトへのD&Dを有効にする という オプション にチェックを付けてインストールしておいてください

スクリプトファイル名:CopyAddTimeStamp.ahk などと付けてください


[]; コマンドライン引数をチェックします[] []Gosub, CheckOption[] []; GUIを表示させます[] []Gosub, InitGUI[] []Return[] []CheckOption:[] []{[] []; コマンドライン引数が あれば以下の処理をします[] [] If ( %0% )[] [] {[] []; %0% には コマンドライン引数の数が入っています、 つまり その回数だけ ループします[] [] Loop, %0%[] [] {[] []; A_Index は Loop の カウンターです[] []; %1% %2%・・・ には コマンドライン引数の 一つ目 二つ目・・・ の値がセットされています[] [] CopyAddTimeStamp(%A_Index%)[] [] }[] []; ここで処理を 実行した場合は GUIを表示させずに スクリプトを終わらせます[] [] ExitApp[] [] }[] [] Return[] []}[] []InitGUI:[] []{[] []; ウインドウの 右上のボタンを x だけにします[] [] Gui, -0x00020000[] []; 見栄えをちょっと良くするために ボタンを設置します、 ボタンを押しても何もしません[] [] Gui, Add, Button, X3 Y3 W94 H94, ここにドロップ[] []; GUIを表示させます[] [] Gui, Show, W100 H100[] []; GUIの ハンドルを取得します[] [] hAutoHotkeyGUI := WinExist("ahk_class AutoHotkeyGUI")[] []; GUIを 常に手前に表示するようにします[] [] WinSet, AlwaysOnTop, On, ahk_id %hAutoHotkeyGUI%[] [] Return[] []}[] []; GUIにファイルがドロップされた場合は このサブルーチンが自動的に呼び出されます[] []GuiDropFiles:[] []{[] []; A_GuiEvent には ドロップされたファイル名が 改行区切りでセットされています[] []; なので 区切り文字を `n とすることで 一行ずつ読み取っていきます[] [] Loop, Parse, A_GuiEvent, `n[] [] {[] []; 実際の値は A_LoopField にセットされています[] [] CopyAddTimeStamp(A_LoopField)[] [] }[] [] Return[] []}[] []; GUIが 閉じられた時に このサブルーチンが自動的に呼び出されます[] []GuiClose:[] []{[] []; GUIを閉じたら 同時にスクリプトを 終わらせます[] [] ExitApp[] []}[] []CopyAddTimeStamp(FileName)[] []{[] []; フルパス(ロングファイル名)を取得します[] [] VarSetCapacity(FullPathName, 2048)[] [] DllCall("kernel32.dll\GetLongPathName", "Str", FileName, "Str", FullPathName, "UInt", 2048)[] []; フルパスを ディレクトリ と ファイル名 と 拡張子 に分離させます[] [] SplitPath, FullPathName, , DirectoryName, ExtensionName, OnlyFileName[] []; すでに 更新日が書き込まれていた場合は その部分を 削除します[] [] OnlyFileName := RegExReplace(OnlyFileName, "_20\d{6}-\d{6}", "")[] []; ファイルの更新日を取得します[] [] FileGetTime, LastModify , %FullPathName%, M[] []; 取得した 日付の フォーマットを変更します[] [] FormatTime, LastModify, %LastModify%, _yyyyMMdd-HHmmss[] []; ファイル名に 更新日を書き足して コピーします[] []; 必要に応じて コピー先を 変更したりしてもいいでしょう[] []; その場合は %DirectoryName% の部分を 変更してあげれば OKですね[] [] FileCopy, %FullPathName%, %DirectoryName%\%OnlyFileName%%LastModify%.%ExtensionName%[] []}[]