4

過去にドハマりした問題にまたぶつかったので、備忘録がてらお裾分けです。(需要はほぼ無さそうですが)

プチライブラリに題記の「ショートカットのリンク先パスを取得」がありますが、

これは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を使ったコードも提示されたんですが、文字コード関連のエラーが出て対処法も分からなかったので諦めました。

この質問は解決済みのためクローズされています。
茄子天 質問の編集
回答とコメントは、会員登録(無料)で閲覧できるようになります。