シンボリックリンク

どうしてこの便利な機能が、Windowsにはないんだろう?
といらっとくることがありまして。


ぐぐったら、、、ありますね。
junction。
どうやら、原理的にはシンボリックリンクじゃないようですけど、、、


動作は同じなので、期待値です。
いろいろあるようですが、インストールをしたくないので、junction.exeを使いました、、、。
が、最初の起動がレジストリを書き換えてくれたことでしょう。
ま、それくらいは良いか。


ただ、いくつか不満が。

  1. 普通のフォルダと見分けがつかない
  2. エクスプローラで削除すると、アンリンクではなく、本当に削除してくれちまう


ええ、シェル拡張のソフト入れれば、いいんでしょ?
ただ、それはしたくない環境なの。


ということで、バッチスクリプトで、同じ場所にテキストファイルを置くことで管理。
そのスクリプト

@echo off
rem シンボリックリンク

:batInit
	rem 初期設定部
	set trgtPath=
	set lnName=
	set mode=
	set mngFile=symbolic_link.txt
	set bakFile=%mngFile%.bak
	if "%~1"=="" goto batHelp

:batPara
	rem パラメータ解析部
	if "%~1"=="" goto batMain
	if "%~1"=="-?" goto batHelp
	if "%~1"=="--help" goto batHelp

	if "%~1"=="-d" (
		set trgtPath=%~dp2
		set lnName=%~n2
		set mode=del
		goto batMain
	)
	if "%~1"=="-s" (
		if "%~2"=="-q" (
			set trgtPath=%~dp3
			set lnName=%~n3
		) else (
			set trgtPath=%~dp2
			set lnName=%~n2
		)
		goto batMain
	)
	set trgtPath=%~dp1
	set lnName=%~n1
	set mode=make
	goto batMain


:batHelp
	rem ヘルプ表示部
	echo usage : %0 [-d] ^ [^]
	echo option
	echo  d : Delete the specified junction
	echo\
	echo usage : %0 [-s] [-q] ^
	echo  s : Recurse subdirectories
	echo  q : Don't print error messages (quiet)
	if "%~1"=="--help" (
		echo\
		echo    example:
		echo       %0 d:\link c:\winnt
		echo       %0 -d d:\link
	)
	echo\
	goto batEnd


:batMain
	rem 主処理部
	rem (悪いと思うが、著作権表示が邪魔ったいのでスキップする)
	for /F "usebackq skip=4 tokens=1,2,3*" %%I in (`%KTERMPATH%bin\junction.exe %*`) do (
		echo %%I %%J %%K %%L
		set result=%%K
	)
	if exist %trgtPath%%mngFile% (
		attrib -H %trgtPath%%mngFile%
	)
	if "%mode%"=="make" goto batPastMake
	if "%mode%"=="del" goto batPastDel
	goto batFin


:batPastMake
	if not "%mngFile%"=="" (
		echo %lnName%	%result%>> %trgtPath%%mngFile%
	)
	goto batFin


:batPastDel
	if exist %trgtPath%%mngFile% (
		for /F "tokens=1*" %%I in (%trgtPath%%mngFile%) do (
			if not "%%I"=="%lnName%" (
				echo %%I	%%J>> %trgtPath%%bakFile%
			)
		)
		del /F %trgtPath%%mngFile%
		if exist %trgtPath%%bakFile% (
			ren %trgtPath%%bakFile% %mngFile%
		)
	)
	goto batFin

:batFin
	if exist %trgtPath%%mngFile% (
		attrib +H %trgtPath%%mngFile%
	)


:batEnd
	rem 終了処理部


ln.bat って名前で、パスの通ったところに置くと、それっぽい感じに使える。
うむ、余は満足じゃ。