AutoHotkey:選択した複数フォルダーのファイル名だけをコピー

AutoHotkeyを使えば複数のファイル名からファイル名だけ抽出することが可能です。通常Ctrl + Shift + Cだと複数のパスをコピーできますが、タイトル名だけコピーすることはできません。そこでAutoHotkeyを使いファイルのタイトル名だけをコピーするホットキーを作成します。

下記のコードはエクスプローラー上で複数のファイルを選択した状態でctrl + shift + Pを押すとファイル名だけを取得するコードになります。

; Explorer
#HotIf WinActive("ahk_exe explorer.exe")

    ; file name only copy
    ^+P:: {
        A_Clipboard := ""
        Send "^+c"

        if ClipWait(1) {
            result := ""
            for line in StrSplit(A_Clipboard, "`n", "`r") {
                result .= RegExReplace(line, '^".*\\|"$') "`r`n"
            }
            A_Clipboard := RTrim(result, "`r`n")
        }
    }
#HotIf

解説

下記のコードはエクスプローラがアクティブの状態かどうかを調べるコードになります。つまりアクティブであれば中の処理コードが実行できるということになります。

#HotIf WinActive("ahk_exe explorer.exe")
~
#HotIf

次に下記のコードはエクスプローラ上でCtrl+ Shif + Pを押すと{}内の処理が走ります。A_Clipboardとは現在のクリップボードをいみしています。それを空にしています。そしてSendはホットキーでつまりCtrl+ Shif + Pを押したらCtrl+ Shif + Cを押したことになる。

^+P:: {
    A_Clipboard := ""
    Send "^+c"
}

コピーしたデータを取り込むにはClipWaitを使わないとコピーした内容を取得できないので使用する。一秒待ちデータが取り込んだら{}内の処理が走る。

    ; file name only copy
^+P:: {
    A_Clipboard := ""
    Send "^+c"

    if ClipWait(1) {
        result := ""
        for line in StrSplit(A_Clipboard, "`r`n") {
            result .= RegExReplace(line, '^".*\\|"$') "`r`n"
        }
        A_Clipboard
    }
}

続いてfor文の処理だが、A_Clipboard内の複数行のStrSplitを使いlineに配列として値を入れることができます。

StrSplitについて

Array := StrSplit(String , Delimiters, OmitChars, MaxParts)

; わかりやすくすると
StrSplit(文字列, 区切る文字, 削除文字, 最大実行回数)

例えば下記のコードのようにパラメータを設定すると3回目で処理を終えます。4行以上のファイル名があるとその後の改行は無視されます(このような使い方はあまりしないと思いますが)。

StrSplit(A_Clipboard, "`r`n", , 3)

そして下記の処理はlineで抜き出した配列の中身をRegExReplace(正規表現)を使ってテキストだけを抽出しresultへ戻します。この時に改行を付け加えて値に戻してあげます。.文字列の連結は省略可能。

result .= RegExReplace(line, '^".*\\|"$') . "`r`n"

そして最後にresultの値をA_Clipboardへ戻してあげます。開業が気になる人はRTrimで改行コードを取り除くこともできます。

A_Clipboard := RTrim(result, "`r`n")

; 改行あり
A_Clipboard := result

参考文献