フォルダのジャンクション作成バッチファイル
ネットワーク上の共有フォルダにあるディレクトリに1000, 1001, 1002, ....と4桁でナンバリングされたディレクトリがあり、これらの先頭に0を追加して5桁に変更した。
このディレクトリを専用に使うソフトの方は5文字名ディレクトリに対応させたが、各ディレクトリへのショートカットを使っている人から「ショートカットのリンクが切れた」との苦情が出た。多分ローカルドライブだったら変更後のリンク先を探してくれそうだが、ネットワーク上の共有フォルダのせいか追跡できなかったようだ。
そこで、5文字名の新しいディレクトリへのリンクを4文字名のジャンクションとして作るバッチファイルを作成した。ディレクトリ数が多いのと、複数階層になっているので、カレントディレクトリから作業を始めて下層まで再帰的に実行する。引き数はない。
@echo off
rem カレントディレクトリ以下のディレクトリ名を取得→%%dにフルパスで入る
for /d /r %%d in (*) do (call :CHNGJUNC %%d)
exit:CHNGJUNC
rem フルパスの%%dからディレクトリ名だけ取り出す
rem %1はバッチファイルの引数ではなく、このサブルーチン呼出し時の引数
set str_in=%~n1
set str_five=%str_in%
set /a str_length=0
rem %%dに含まれるディレクトリ名の文字数を数える
:CHNGJUNCLOOP
set str_in=%str_in:~1%
set /a str_length+=1
if not "%str_in%"=="" (goto :CHNGJUNCLOOP)
rem ディレクトリ名が5文字のとき、かつ1文字目が0のとき、5文字名のディレクトリに対するジャンクションを4文字名で作成
if %str_length% equ 5 (
if "%str_five:~0,1%"=="0" (mklink /J %~p1%str_five:~1% %~p1%str_five%)
)
exit /b
forやcallでのサブルーチン呼び出しは初めてだったのだが、forの中の環境変数の扱いや、callで呼び出したサブルーチンの引数の扱いにちょっと戸惑ってしまった。
最近のコメント