如何获取ShellFolderItem InvokeVerbEx方法的动词参数列表?
关于ShellFolderItem.InvokeVerbEx的vArgs参数获取方案
一、编程方式提取参数格式
1. 读取注册表关联项
Shell动词的命令行模板通常存放在注册表中,可直接通过PowerShell读取对应路径:
- 通用文件类型:
HKCR\*\shell\<VerbName>\command - 文件夹类型:
HKCR\Folder\shell\<VerbName>\command - 特定扩展名类型:
HKCR\.txt\shell\<VerbName>\command(以txt为例)
示例PowerShell代码:
# 获取.txt文件的"edit"动词命令行模板 $verbName = "edit" $regPath = "HKCR\.txt\shell\$verbName\command" if (Test-Path $regPath) { (Get-ItemProperty -Path $regPath)."(default)" }
返回的命令行中的占位符(如%1、%*)对应参数位置:比如notepad.exe %1说明该动词无需额外vArgs,%1就是目标文件本身;如果是foo.exe %1 /option:%2,则vArgs可传入对应参数值。
2. 使用COM接口查询关联信息
通过IQueryAssociations接口可更精准获取动词关联的命令行,避免注册表读取的局限性,可借助内嵌C#代码实现:
Add-Type @" using System; using System.Runtime.InteropServices; [ComImport, Guid("c46ca590-3c3f-11d2-bee6-0000f805ca57")] public interface IQueryAssociations { void Init(uint flags, [MarshalAs(UnmanagedType.LPWStr)] string pszAssoc); void GetString(uint flags, uint strType, [MarshalAs(UnmanagedType.LPWStr)] string pszExtra, [MarshalAs(UnmanagedType.LPWStr)] out string ppszOut); } public class AssocHelper { public static string GetCommand(string ext, string verb) { var query = (IQueryAssociations)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("000214e6-0000-0000-c000-000000000046"))); query.Init(0, ext); query.GetString(0, 1, verb, out string cmd); Marshal.ReleaseComObject(query); return cmd; } } "@ # 调用示例:获取.txt文件edit动词的命令行 [AssocHelper]::GetCommand(".txt", "edit")
二、参考资料补充
微软官方文档对vArgs的细节描述确实缺失,但可参考:
- 旧版Windows Shell SDK文档(如Windows XP SDK),其中对常见Shell动词的参数有更详细说明
- 经典Shell编程书籍(如《Windows Shell编程》),书中覆盖了动词参数的常见格式与使用场景
三、常见动词的参数示例
- open:通常无需额外参数,vArgs留空即可;部分程序支持启动参数,如
InvokeVerbEx("open", "/minimized")(取决于关联程序是否兼容) - print:部分程序接受打印参数,如
/p指定打印,或/printer:"打印机名称" - runas:可传入用户身份参数,如
InvokeVerbEx("runas", "/user:Administrator")
内容的提问来源于stack exchange,提问作者Paul π
相关产品推荐
相关产品推荐

