「ショートカットのリンク先パスを取得」を改造
過去にドハマりした問題にまたぶつかったので、備忘録がてらお裾分けです。(需要はほぼ無さそうですが)
プチライブラリに題記の「ショートカットのリンク先パスを取得」がありますが、
これはShell.CreateShortcutを使用しているため、「ファイル名」に指定できるパスは256?バイトまでという制限があります。
(MAX_PATHで指定する260文字(デフォ)ではなく256バイト)
で、ユーザが好き勝手に作成するフォルダに配置されたショートカットの場合、制限オーバーすることがちょこちょこあります。
(フォルダの階層ムダに深すぎ問題)
この問題に対処すべく今日1日苦しんだ結果、以下のようなVBSのスクリプトが完成しました。
VBSです。時代に逆行してます。
----ココカラ-------------
shortcut_path = !ショートカットファイルパス!
' 指定されたファイルを絶対パスに変換。およびファイルの存在チェック。
SetUMSVariable "$FILE_PATH_TYPE", "11"
SetUMSVariable "$PARSE_FILE_PATH", shortcut_path
shortcut_path = GetUMSVariable("$PARSE_FILE_PATH")
If shortcut_path = "" Then
Err.Raise 1, "", "指定されたファイルが見つかりません。"
End If
Set shell = CreateObject("Shell.Application")
Set fso = CreateObject("Scripting.FileSystemObject")
' ショートカットが格納されているフォルダを取得
folder_path = fso.GetParentFolderName(shortcut_path)
' ショートカットのファイル名を取得
file_name = fso.GetFileName(shortcut_path)
Set shortcut = shell.NameSpace(folder_path).ParseName(file_name)
' リンク先のパスを取得
target_path = shortcut.GetLink.Path
SetUMSVariable $リンク先パス$, target_path
----ココマデ-------------
一応Python版も作成しました。ただ外部ライブラリのpywin32を使ってるので、WinActor標準のPythonだと使えません。
----ココカラ-------------
import os
import pythoncom
import win32com.client
def get_shortcut_target(shortcut_path):
# Initialize COM
pythoncom.CoInitialize()
# Create a Shell object
shell = win32com.client.Dispatch("Shell.Application")
# Get the shortcut object
shortcut = shell.NameSpace(os.path.dirname(shortcut_path)).ParseName(os.path.basename(shortcut_path))
# Get the target path
target_path = shortcut.GetLink.Path
# Uninitialize COM
pythoncom.CoUninitialize()
return target_path
# ショートカットファイルのパスを指定
shortcut_path = !ショートカットファイルパス!
# 指定されたファイルを絶対パスに変換。およびファイルの存在チェック。
winactor.set_variable("$FILE_PATH_TYPE", "11")
winactor.set_variable("$PARSE_FILE_PATH", shortcut_path)
shortcut_path = winactor.get_variable("$PARSE_FILE_PATH")
if not shortcut_path:
raise FileNotFoundError("指定されたファイルが見つかりません。")
# リンク先を取得
target_path = get_shortcut_target(shortcut_path)
winactor.set_variable($リンク先パス$, target_path)
----ココマデ-------------
pythoncom.CoInitialize()とかは無くても動くんですが、Copilot先生が入れとけと言うのでとりあえず入れてます。
Copilot先生にはpylnk3を使ったコードも提示されたんですが、文字コード関連のエラーが出て対処法も分からなかったので諦めました。