フォルダーのショートカットを、リンク先のフォルダーに置き換える

100個以上ある「フォルダーのショートカット」を、リンク先のフォルダーと
置き換えたい。そんな事案が発生した。さて、どうしたものか。
f:id:Infoment:20200429215105p:plain

やりたいことを言葉で書いてみると、こんな感じか。

  1. リンク先のパスを取得する。
  2. 1. を、ショートカットファイルの保存パスに移動する。
  3. ショートカットファイルを削除する。

リンク先のパスを取得する方法は、色々と調べてみて、
こちらを参照した(ありがとうございます)。
vbabeginner.net

とここで、マクロを作成していて気が付いた。
FileSystemObjectが、ここにもある?
f:id:Infoment:20200429215654p:plain

今まで馴染みがあったのは、Microsoft Scripting Runtimeを
参照したときのもの。これは一体・・・。

方々調べてみたところ、thomさんのブログに解説が載っていた。
(いつもありがとうございます)。
thom.hateblo.jp

ということで、出来上がったのがこちら。

Function ReplaceWithShortcutDestination(shortcut_path As String) As Boolean

    ' Windows Script Host Object Model を予め参照設定のこと。
    Dim Wsh As IWshRuntimeLibrary.WshShell
    Set Wsh = New IWshRuntimeLibrary.WshShell

    On Error GoTo er:

    Dim ShortCut As IWshRuntimeLibrary.WshShortcut
    Set ShortCut = Wsh.CreateShortcut(shortcut_path)

    ' ショートカット先のパス
    Dim FolderPath As String
        FolderPath = ShortCut.TargetPath

    ' ScriptingRuntime.FileSystemObjectと同一機能。
    ' 今回はWindows Script Host Object Modelを参照済みであるため、これを用いる。
    Dim FSO As IWshRuntimeLibrary.FileSystemObject
    Set FSO = New IWshRuntimeLibrary.FileSystemObject

    ' ショートカット先のフォルダーを、ショートカットが保存されているパスに移動。
    ' ※末尾の「\」を除くと、ショートカット先のフォルダ内にあるフォルダおよび
    '  ファイルが、ショートカットが保存されているパスに移動する。
        FSO.MoveFolder FolderPath, FSO.GetParentFolderName(shortcut_path) & "\"
    ' ショートカットを削除。
        FSO.DeleteFile shortcut_path

    ' 置き換え成功。
        ReplaceWithShortcutDestination = True
        Exit Function

er:
    ' 置き換え失敗。
        ReplaceWithShortcutDestination = False

End Function

一応、テスト結果は良好だった。
さっそく明日、職場(本番環境)で試してみるとしよう。

参考まで。