使用批处理文件设置可移动介质上可执行文件的兼容性标志

使用批处理文件设置可移动介质上可执行文件的兼容性标志

编辑:进一步调查后发现,SIGN.MEDIA=xxxxxxx 字符串似乎根据可移动媒体上的子文件夹而变化,因此它根本不是可移动媒体的设备 ID。不过,我似乎找不到任何关于它是什么或如何计算的真实信息。我将在下面留下原始问题,但我想我真的想问的是:

如何使用批处理文件为可移动媒体上的各个文件夹中的可执行文件设置兼容性标志?

如果失败了,我如何计算可移动媒体上任何给定文件夹的 SIGN.MEDIA=xxxxxx 字符串?

编辑2:进一步调查发现,SIGN.MEDIA=xxxxxxx 字符串似乎每次重新插入可移动媒体时都会发生变化 - 即使分配了相同的驱动器号。我猜我想要实现的目标要么是不可能实现的,要么需要比批处理文件更强大的东西。

有人知道SIGN.MEDIA=xxxxxxx字符串是如何计算的吗?

最终编辑:好吧,我正式放弃了。看来微软自己都不知道(或者不会说)这是如何计算的。看这里

经过更多测试后发现有时弹出并重新插入同一可移动介质后,同一位置的同一文件的 SIGN.MEDIA=xxxxxxx 值会发生变化,但有时会话之间保持不变。据我所知,似乎没有一致性。此外 - 至少基于粗略的实验 - 它不使用 SIGN.MEDIA=xxxxxxx 值来表示 USB 记忆棒,但对 SD 卡和 DVD 却使用。因此,在更普遍的处理可移动媒体的方式上似乎没有任何一致性。这真是令人恼火 - 以至于我实际上认为完全重新考虑这个项目会更容易,这样我就不必处理微软糟糕的文档和不透明的实现。

原始问题如下,仅供参考...

在批处理文件中获取可移动媒体设备 ID

我搜索了很久试图找到这个问题的答案,但似乎找不到任何相关信息。

我有一个批处理文件,它循环遍历目录并为可执行文件加载设置兼容性标志。该批处理文件与可执行文件位于同一目录中。

我使用以下语法来设置注册表值:

reg.exe Add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%~dp0Example.exe" /d "WINXPSP3 RUNASADMIN"

当从内部驱动器上的任何位置运行时,它都可以正常工作 - 例如,它将添加如下注册表项:

C:\Directory\SubDirectory\Example.exe REG_SZ WINXPSP3 RUNASADMIN

当从可移动媒体(本例中为 SD 卡)运行时,它会执行完全相同的操作(尽管显然将 C:\ 替换为可移动媒体的实际驱动器号)。但问题是,兼容性标志实际上并未设置在可执行文件上,尽管它存在于注册表中。

经过进一步调查,当手动添加兼容标志然后查询注册表时,会添加以下格式的键:

SIGN.MEDIA=xxxxxxx \Directory\SubDirectory\Example.exe (where x... is a hexadecimal value)

因此,路径中的驱动器号被可移动媒体的设备 ID(我想是吧?)所取代。

所以我的问题是:有没有办法从批处理文件中获取设备 ID(或其他信息)?

理想情况下,我希望首先找到一种方法来测试批处理文件是否在可移动媒体上,然后我可以使用一个简单的 IF 语句来构建正确的路径,但是如果没有,我将选择一种方法来获取设备 ID,然后我可以保留两个单独的批处理文件。

答案1

我认为您所需要的只是以下命令:

wmic logicaldisk get DeviceID, Description

它将检查所有逻辑磁盘并显示设备 ID 以及它是本地驱动器还是可移动驱动器。

您还可以编辑它以仅显示可移动磁盘的设备 ID,如下所示:

wmic logicaldisk get DeviceID, Description | find "Removable Disk"

或者你可以简单地使用:

wmic logicaldisk where drivetype=2 get deviceid

无论哪种方式,只要最适合你的脚本就可以了。

相关内容