今回は、デスクトップに置かれているショートカットファイル(lnk)のリンク先を一斉に書き変えることが必要になり、その処理をVBScriptで作成したので、参考までに紹介させていただきます。
ファイルサーバーのリプレイスや移行などで、ユーザーの自端末内で使用している各ショートカットを一斉に書き変えないといけないケースなどでご活用ください。
因みに、今回のサンプルプログラムはVBScript用として作成しておりますが、VBAでも基本的な構文は同じであり、多少の修正をすればほぼ同様の処理で実装することは可能です。
サンプルコードの処理概要
当スクリプトの処理概要を以下になります。
- ファイルサーバーのホスト名変更に伴いリンク先を書き変えるケースを想定
- 処理対象のディレクトリはデスクトップ
- サブフォルダも含めて再帰的にlnkファイルを全ファイル走査で選別
- リンク先のパスが特定の文字列の場合だけ書き換え
- 書き換え対象は「リンク先パス」と「作業フォルダ」
ショートカットのリンク先を書き変えるサンプルコード
ご自身の環境によって処理内容を書き変えて使用してください。
当然ですが、条件に当てはまるリンク先はすべて書き変えてしまいます。
よって、動作テストをする際にはショートカットファイルのバックアップを取っておくなどの対策をしてから試すようにしてください。
Option Explicit
Const OldHost = "\\OldServerName" '変更前ホスト名
Const NewHost = "\\NewServerName" '変更後ホスト名
Call Main()
Sub Main()
Dim objFS
Dim objShell
Dim DesktopPath
'デスクトップのファルダパスを取得します。
Set objShell = CreateObject("WScript.Shell")
DesktopPath = objShell.SpecialFolders("Desktop")
'FileSystemObjectを生成します。
Set objFS = CreateObject("Scripting.FileSystemObject")
'ショートカット書き換え処理を呼び出します
ShortCutPathReplace objFS.GetFolder(DesktopPath)
'オブジェクトを破棄します。
Set objFS = Nothing
Set objShell = Nothing
msgbox "ショートカットファイルのリンク先変更が完了しました。"
End Sub
'引数で渡されたフォルダのパスとその配下のサブフォルダ全てを再帰的に走査し、
'ショートカットファイルのリンク先を書き換えます。
Sub ShortCutPathReplace(ByVal objBaseFolder)
Dim objFS
Dim objSubFolder
Dim objFile
Dim objShell
Dim objShellLink
Dim ShortCutPath
Dim WorkDirPath
'オブジェクトを生成します。
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
'サブフォルダを再帰的に走査します。
For Each objSubFolder In objBaseFolder.SubFolders
ShortCutPathReplace objSubFolder
Next
'フォルダ内の全てのファイルを走査します。
For Each objFile In objBaseFolder.files
'ファイルパスの拡張子を判定します。
If objFS.GetExtensionName(objFile.Path) = "lnk" Then
'ショートカットのオブジェクトを生成します。
Set objShellLink = objShell.CreateShortcut(objFile.Path)
'ショートカットのリンク先を取得します。
ShortCutPath = objShellLink.TargetPath
'作業フォルダのパスを取得します。
WorkDirPath = objShellLink.WorkingDirectory
On Error Resume Next
'ショートカットのリンク先が書き換え対象かを判定します。
If Left(ShortCutPath,Len(OldHost)) = OldHost Then
'リンク先パスを書き換えます。
objShellLink.TargetPath = Replace(ShortCutPath,OldHost,NewHost)
'リンク先の変更を保存します。
objShellLink.Save
End If
'ショートカットの作業フォルダが書き換え対象かを判別します。
'※ショートカットがフォルダの場合は作業フォルダは空なのでIFの判定でFalseになり無視されます。
If Left(WorkDirPath,Len(OldHost)) = OldHost Then
objShellLink.WorkingDirectory = Replace(WorkDirPath,OldHost,NewHost)
'作業フォルダの変更を保存します。
objShellLink.Save
End If
'エラー処理
If Err.Number <> 0 Then
'エラーが出た場合は、msgboxで通知してエラー対象のショートカットファイルを通知
msgbox "以下のショートカットファイルのリンク先書き換え処理でエラーが発生しました。" _
& vbcrlf & vbcrlf & objFile.Path
End If
'エラーを初期化
On Error Goto 0
End If
Next
'オブジェクトを破棄します。
Set objFile = Nothing
Set objSubFolder = Nothing
Set objShellLink = Nothing
Set objFS = Nothing
Set objShell = Nothing
End Sub
【参考】WshShortcutオブジェクトについて
今回のサンプルコードにおけるポイントは「WshShortcutオブジェクト」です。
今回はWshShortcutオブジェクトの「TargetPath」プロパティと「WorkingDirectory 」プロパティを使用していますが、他にもショートカットを定義するためのプロパティはあるので、他のプロパティを知りたい場合は、以下のリンク先をご参照ください。

【参考】ショートカットファイルの作成について
当ブログでは、過去にIE関連の設定を自動化する処理を紹介しており、その記事のなかで、ショートカットを新しく作成するサンプルコードも掲載しております。
良かったらこちらも併せてご確認ください。
最後に
今回の記事では、「デスクトップに置かれているショートカットファイルのリンク先を一斉に書き変える処理」をVBScriptで実装した際のサンプルコードを紹介させていただきました。
私は実際にこのスクリプトを使用して、自社のユーザー端末内のショートカットを更新する予定です。
今回の記事がどなたかの参考になれば幸いです。
それでは今回も読んでいただきましてありがとうございました。


