Answers:
您看到的是称为“广告快捷方式”的特殊快捷方式。快捷方式实际上msiexec.exe
是Windows Installer可执行文件的链接。公告的快捷方式允许安装程序作者仅安装其应用程序的一部分,然后在通过公告的快捷方式访问它们时安装其他组件。Windows Installer还会在每次运行该应用程序时自动检查所有已安装文件的完整性,因此您可以确保该应用程序在运行时有效。
这是一个堆栈溢出问题,其中包含有关宣传的快捷方式的更多信息。
找到快捷方式最终运行的可执行文件不是一件容易的事,并且会涉及到注册表的一些挖掘。 休的建议可能要简单得多。
对于Win XP下的某些快捷方式,我想知道同样的事情。我尝试了Cygwin,readshortcut
但是没有告诉我真正的目标:
$ readshortcut.exe -fa "Microsoft Word.lnk"
Target: /cygdrive/c/WINDOWS/Installer/{00000409-78E1-11D2-B60F-006097C998E7}/wordicon.exe
Working Directory:
Arguments:
Show Command: Normal
Icon Library: /cygdrive/c/WINDOWS/Installer/{00000409-78E1-11D2-B60F-006097C998E7}/wordicon.exe
Icon Library Offset: 0
Description: Create and edit text and graphics in letters, reports, Web pages, or e-mail messages by using Microsoft Word.
因此,它们显然与Windows Installer有关。要找到可执行文件,您始终可以运行它并使用Process Explorer来获取路径-在我的情况下为C:\Program Files\Microsoft Office2K\Office\WINWORD.EXE
。
对于那些希望在PowerShell中不使用模块就可以做到这一点的人:
$lnk = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Adobe\Adobe Acrobat X Pro.lnk"
$WindowsInstaller = New-Object -ComObject WindowsInstaller.Installer
$ShortcutTarget = $WindowsInstaller.GetType().InvokeMember("ShortcutTarget","GetProperty",$null,$WindowsInstaller,$lnk)
$StringData1 = $ShortcutTarget.GetType().InvokeMember("StringData","GetProperty",$null,$ShortcutTarget,1)
$StringData3 = $ShortcutTarget.GetType().InvokeMember("StringData","GetProperty",$null,$ShortcutTarget,3)
$WindowsInstaller.GetType().InvokeMember("ComponentPath","GetProperty",$null,$WindowsInstaller,@($StringData1,$StringData3))
请尝试以下任一方法(来自Tek-Tips论坛):
脚本
' GetRealTarget.vbs
' This version needs to be run under wscript engine rather than cscript
' Pass the full path to an MSI "Advertised Shortcut" lnk file (including the extension) as a parameter
' e.g. assuming that we have a default install of Office 2003 for All Users:
' GetRealTarget "C:\Documents and Settings\All Users\Start Menu\Programs\Microsoft Office\Microsoft Office Excel 2003.lnk"
' Displays fully resolved target for the MSI shortcut
Option Explicit
Dim MSITarget
On Error Resume Next ' just some simple error handling for purposes of this example
If wscript.arguments.count = 1 Then ' did actually pass an MSI advertised shortcut? Or, at least, a parameter that could be such a thing?
With CreateObject("WindowsInstaller.Installer")
Set MSITarget = .ShortcutTarget(wscript.arguments(0))
If Err = 0 then
MsgBox .ComponentPath(MSITarget.StringData(1), MSITarget.StringData(3))
Else
MsgBox wscript.arguments(0) & vbcrlf & "is not a legitimate MSI shortcut file or could not be found"
End If
End With
End If
On Error Goto 0
PowerShell(已安装此Windows Installer模块)
get-msiproductinfo | where { $_.ProductState -match "Installed" } | fl AdvertisedProductName, InstallLocation
打开regedit
并搜索程序名称。这将需要几个“再次搜索”(F3),但最终您将找到该文件夹。
就我而言, HKEY_CLASSES_ROOT\Applications\<name of app>\shell\open\command
找出可执行文件位置的最简单方法: