重所周知,sandboxie创建程序在sandboxie内运行的快捷方式有点麻烦。操作步骤比较多,选择程序的过程中sandboxie有难以忍受的卡顿。
因此我打算写一个bat,把bat丢到sendTo路径,这样我对着一个软件右键-发送到-自定义bat,就可以快速创建快捷方式了。
通过百度和测试,发现有三种书写创建快捷方式的方式:
- mklink命令。此方案在win10中需要修改组策略(仅有管理员权限,未修改策略,是无法成功运行命令的),且无法添加运行时的参数,故不可用
- 创建InternetShortcut文件。我在测试时发现点击文件只能打开edge浏览器,无法像介绍一样执行其他程序。
- 调用vbs生成快捷方式
所以其实只有一种。
首先我找了一个sandboxie的快捷方式查看他的参数:
"C:\Program Files\Sandboxie\Start.exe" /box:DefaultBox "C:\Users\Yazii\Desktop\虾米音乐.lnk"
显然分为三个部分:sandboxie启动路径、调用沙盒的名称、被调用的程序
下边是我的成品。
@ECHO OFF
IF not exist %1 exit
if /i %~x1 == .exe (goto y)
if /i %~x1 == .msi (goto y)
mshta VBScript:Execute("Set a=CreateObject(""WScript.Shell""):Set b=a.CreateShortcut(a.SpecialFolders(""Desktop"") & ""\[sandbox]%~n1.lnk""):b.TargetPath=""C:\Program Files\Sandboxie\Start.exe"":b.WorkingDirectory=""%~dp1"":b.Arguments=""/box:DefaultBox %~1"":b.Save:close")
exit
:y
mshta VBScript:Execute("Set a=CreateObject(""WScript.Shell""):Set b=a.CreateShortcut(a.SpecialFolders(""Desktop"") & ""\[sandbox]%~n1.lnk""):b.TargetPath=""C:\Program Files\Sandboxie\Start.exe"":b.WorkingDirectory=""%~dp1"":b.Arguments=""/box:DefaultBox %~1"":b.IconLocation=""%~1"":b.Save:close")
exit
但是目前仍不完美。最凸出的一个问题是,参数的第三部(即被调用的程序的路径)是没有引号包裹的,这可能会导致一些问题。
其他有待完善的地方有:
- sandboxie的路径是手动写死的,不能自动探测路径。(我觉得无所谓,有复制这个bat到sendTo路径的时间,也就把路径配置好了)
- 沙盒名称是默认沙盒,不能手动选择(对我来说也不是问题,我只用默认沙盒;如果切实有需求,直接多复制几个bat,甚至在sendto路径建一个文件夹放sandboxie的快捷方式都不是很费力气
- 除exe和msi后缀外,其他文件的快捷方式无法正常显示图标。
4.对lnk快捷方式,无法正常显示图标。
关于第三点,实际上是有解决方法的,但是实在能力有限,有思路,但是不会写。
基本思路是:
- 从注册表获取输入的文件的后缀关联的应用。
REG QUERY HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\%~x1\OpenWithProgids
- 从注册表获取程序在电脑上的路径。
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\应用程序名称\shell\open\command - 把路径添加到IconLocation参数中去。
关于第四点:需要在解析快捷方式对应的指向文件路径,使用被指向的文件进行处理。目前我还不能搞定。
回头想想,这种问题给sandboxie替issue或者自己改sandboxie程序或者直接c语言写个程序是最方便的,而bat写起来太脑抽了。但是我就是那种比较讲缘份的人,用bat下手了,就不打算改门庭了。