Windows Shell Automation InvokeVerb 基于数字而不是命令字符串
本文关键字:字符串 命令 数字 Automation Shell InvokeVerb 于数字 Windows | 更新日期: 2023-09-27 18:31:10
通常外壳自动化 InvokeVerb 只接受字符串命令,基于下面的文档:https://msdn.microsoft.com/en-us/library/ms723189(v=vs.85).aspx
但是我注意到一个cmd行EXE实用程序,它接受一个数字http://www.technosys.net/products/utils/pintotaskbar
这很有趣,因为在 Windows 10 中,"&固定到任务栏"已从 shell 自动化中删除,尽管在 UI 中可见。( https://connect.microsoft.com/PowerShell/feedback/details/1609288/pin-to-taskbar-no-longer-working-in-windows-10 )
但是,此EXE在命令工作时传递"数字"5386。
我很想知道在PowerShell/VBScript/.NET语言或Win32 C/C++中可以使用什么方法来实现这一点。
我知道这几乎肯定是不受支持的,并且可能会随时中断,因为这些数字在操作系统版本之间发生了变化。
在 PowerShell 中使用字符串版本的示例
$filepath = "C:'windows'system32'notepad.exe"
$path = Split-Path $FilePath
$shell= New-Object -com "Shell.Application"
$folder=$shell.Namespace($path)
$item = $folder.Parsename((split-path $FilePath -leaf))
$item.InvokeVerb("&Pin to taskbar")
底层 shell 上下文菜单扩展系统实际上本机使用数字 ID;字符串动词是顶部的可选层。但是,正如您所观察到的,命令 ID 是上下文菜单扩展的内部命令,并且不能保证在版本之间(甚至在调用之间)保持一致 - 动词的全部意义在于它们允许以编程方式调用命令,而不管它们的 ID 如何。
在 C/C++ 中,您可以通过将数字 ID 转换为字符串指针来按其 ID 调用命令(其基本原理是,由于所有有效的字符串指针都高于 65535,因此只要数字适合 16 位,将数字作为字符串指针传递是"安全的",因为接收 API 能够正确确定它是否是"真正的字符串")。
请注意,这与将数字打印为字符串不同,后者不正确。MAKEINTRESOURCE
宏正是为此目的而存在的。
例如,ID 为 1234 的命令将使用 MAKEINTRESOURCE(1234)
作为动词进行调用。
这些天我在基于 Windows 脚本主机的脚本中遇到了同样的问题。
使用本地化字符串调用谓词不像以前那样工作。但是,您仍然可以获取项的"谓词"集合,然后枚举它们,直到获得要调用的谓词。然后,您可以使用它的"DoIt"方法调用它,而无需传递谓词名称。
在 WSH JScript 中,它看起来像这样:
/* workaround for 'item.InvokeVerb("&Delete")' which no longer works */
var verbs = item.Verbs(); // item == return of folder.ParseName(..)
for (var x = 0; x < verbs.Count; x++)
{
var verb = verbs.Item(x);
if (verb.Name == "&Delete") //replace with "&Pin to taskbar"
{
try
{
verb.DoIt();
WSH.Echo ("Deleted:", item.Name);
}
catch(e)
{
WSH.Echo ("Error Deleting:", item.Name + "'r'n't", e.description, e.number);
}
break;
}
}
}
可能它也可以在PowerShell中以某种方式工作
ffr:
https://learn.microsoft.com/en-us/windows/win32/shell/folderitem-verbshttps://learn.microsoft.com/en-us/windows/win32/shell/folderitemverb