ショートカットに相対パスを指定する。
ショートカットに相対パスを指定することができるか?という質問がよくあります。
その答えは、
ショートカットファイルからの相対パスは、できない。
カレントディレクトリからの相対パスなら、できる。
エクスプローラからショートカットファイルをダブルクリックしたときのカレントディレクトリはショートカットファイルの場所なので、それでよければ、ショートカットのターゲットと引数を以下のように指定します。
%windir%\system32\rundll32.exe shell32.dll,ShellExec_RunDLL "相対パス(注1)" [引数...]
もし、ショートカットの作業フォルダを指定すると、そこからの相対パスになります。
なので、ショートカットの作業フォルダは、空にしておきます。
もし、引数が不要なら、
%windir%\system32\rundll32.exe url.dll,FileProtocolHandler "相対パス"
でも可。
単にフォルダを開くだけなら、
%windir%\explorer.exe /n,"相対パス"
%windir%\explorer.exe /e,"相対パス"
でも可。
あるいは、また、
%COMSPEC% /C START "" "相対パス" [引数...]
として、最小化にしておきます。
フルパスが必要な場合は、例えば、
%COMSPEC% /C START "" "file://%CD%\相対パス" [引数...]
とします。
ショートカットファイルからの相対パスは無理ですが、バッチファイルやWSH、HTM、HTAなら%~f0やWScript.ScriptFullName、location.pathnameで自身のパスを得て代替できます。
バッチファイル
START "" /D "%~dp0" "相対パス" [引数...]
VBSファイル
CreateObject("Shell.Application").ShellExecute "相対パス","[引数...]",WScript.ScriptFullName & "\.."
WScript.Sleep 5000
(注1)
ShellExec_RunDLLは、本来、アプリ起動用なので、単純名(\を含まない)を指定すると、%SystemRoot%\System32やPATHを検索します。
ShellExec_RunDLLで、検索に行かないようにするには、\と名前の両方を含むパス名を指定します。
例えば、カレントディレクトリ内の名前は、".\名前"とします。
特殊な例では、"."や".."も、%SystemRoot%\System32を検索して見つかるようです。
なので、"."は"..\現フォルダ名"、".."は"..\..\親フォルダ名"とします。
※VistaではShellExec_RunDLLの仕様が変わったようで、この手が使えないようです。
詳しくは、http://scripting.cocolog-nifty.com/blog/2010/03/post-b124.html