[小ネタ]パスを取得するバッチファイル


開発者はパスを欲しがる

例えば

  • ライブラリのパスを設定するとき
  • コンパイラの検索パスを設定するとき
  • SDK のパスを設定するとき

などなど

こんな時、エクスプローラからパスをコピーして、ファイル名をコピーして、とかやりますよね。
正直、メンドイ

右クリック SendTo に、パスをクリップボードに入れてくれるアプリがあればいいのに!

作りました

そもそもは Delphi で作って長年使ってました。
でも、よくよく考えたらバッチファイルでできんじゃね!?
となって、バッチファイルで作ってみました。

path2clip.bat
if /i "%~x1"==".lnk" (for /f "delims=" %%f in ('type "%~f1" ^| find "\" ^| find "."') do set /p<NUL="%%f" | clip) else set /p<NUL="%~f1" | clip

なんか複雑に見えるけど、複雑なのはショートカットの実体を取り出すところで、そんな事しなくて良いのなら、もっと単純になります。

path2clip.bat
 set /p<NUL="%~f0" | clip

上記のどちらかのバッチファイルを SendTo に作ります。

(SendTo はデフォルトであれば C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\SendTo\ )

すると

こんな感じで登録されて、クリックするとクリップボードにパスがコピーされる仕組みです。

なお、バッチファイルは別の場所に保存しておいて、ショートカットを SendTo に入れればアイコンや名前を変更できます。

うーん、便利。

解説

clip

clip コマンドが全ての肝です。
clip コマンドはパイプかリダイレクトで受け取ったデータをクリップボードにコピーしてくれます。

ショートカットの実体探し

for /f %%var in (CMD) do コマンドを使うと、CMD の実行結果を %%var に入れてくれるという、どう考えてもクレイジーな仕様があり、それを使ってます。
また、.lnk ファイルの実体をちゃんと探すためには WSH を使う必要があったので、ここに載ってたズルイ方法(type で中身を出力して取得)でやってます。

改行無し出力

当初

echo "%~f1" | clip

としていました。

が!
コレだと改行コードが含まれてしまうのでした(パイプの前にある空白も)。

そこでググったところ set /p による技を発見

それを参考に、echo から set に置き換えました。
具体的な仕組みはリンク先のブログをご覧下さい!

おまけ

OpenPath.bat
if /i "%~x1"==".lnk" (for /f "delims=" %%f in ('type "%~f1" ^| find "\" ^| find "."') do explorer "%%~dpf") else explorer "%%~dp1"

これを SendTo に登録しておくと、ショートカットのフォルダを開いてくれます!これまた便利!

まとめ

Bash が来ようという時代に、バッチファイルの記事を書いた。

追記

キーボードに手を伸ばすのが面倒でなければ、Shift + 右クリックで「パスのコピー」ができるとのご指摘!
そういえばあったけど、Windows95 の時代から SendTo に登録してたので忘れてた…。
ご指摘ありがとうございます。