CDコマンドの機能拡張〜ショートカット対応

少し前にcd コマンドの拡張を行った。ちょっと思いついてショートカットにも対応してみた(多分)。.lnk ファイルの内容をきちんと解析しているわけじゃないので駄目なケースもあるのかもしれないが今のところ動いている。
面倒なのでショートカット先はCドライブしか対応していない。

長いので変更点の周辺だけ示す。

if exist "%~1" ( %存在するか?%
 if exist "%~1\" ( %ディレクトリか?%
  call :pushd "%~1"
 ) else ( %普通のファイルだ%
  if "%~x1"==".lnk" ( %ショートカットか?%
   for /f "delims=\ tokens=1*" %%A in ('more "%~1"') do (
    if "%%A"=="C:" call "%0" "C:\%%B"&goto :eof
   )
  )
  call :pushd "%~dp1"
 )
 goto :eof
)

DOSKEY cd=cdd $*エイリアス定義を行うと、cd の後ではディレクトリ名しか補完しないので、ショートカットファイルを対象にするときは cdd と元のバッチスクリプト名を使ったほうがいい。

2004-08-31 追記

フォルダを共有した状態でその中のファイル・フォルダのショートカットを作ったものに対しては上記の方法では駄目なようだ。一旦共有を削除してからショートカットを作ればOK。その後また共有を設定する。共有した状態で作ったショートカットにはローカルディスク上のファイル・フォルダについても共有名が記録されている。
ショートカットの内部構造を解説しているウェブページがあれば紹介いただきたい。

2004-11-01 コメント*1でショートカットの構造を教えてもらった

http://www.stdlib.com/art6-Shortcut-File-Format-lnk.html
http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf

ありがとうございます。
ただ、バッチスクリプトでは厳密な対応には限界があるので、問題が発覚する都度、対応を考えることにしたいと思います。個人的には今の所、9/26版の機能で十分です。

*1:オリジナルサイトでのコメントの話なのでこのサイトではコメントは付いてない