求解一个注册表的问题

2023-03-09 07:07:16 +08:00
 Al0rid4l

现在我有这么一个注册表项, 希望添加一个目录空白处右键菜单, 调用一个 vbscript 脚本用 Neovide 打开目录

[HKEY_CLASSES_ROOT\Directory\Background\shell\nvimwithoutplugins\command]
@="wscript C:\\Devtools\\Neovim\\bin\\start.vbs %1"

现在脚本双击执行或命令行下执行是没问题的, 但写到注册表里用右键菜单调用就提示找不到文件

This file does not associated with for performing this action...

但是默认文件关联 .vbs 确实是 wscript.exe

去掉 %1 参数就提示找不到文件

The system cannot find the file specified.

但是这个文件路径又确实存在.

简而言之就是, 文件路径没问题, 文件关联也没问题, 命令行下调用 start.vbs ./ 也没问题, 双击执行 vbs 脚本也没问题, 只有写在注册表里的命令有问题, 求解是什么原因?

不是很懂注册表的路径查找机制, 从别地方抄来糊的...

1286 次点击
所在节点    Windows
13 条回复
yaoyao1128
2023-03-09 07:19:02 +08:00
用 wscript.exe 的绝对路径
kokutou
2023-03-09 07:33:26 +08:00
这种问题英文在 Google 搜,
explorer rightclick menu Background command not found

第一个 stackoverflow 就有答案和注意事项,注意事项就有 1 楼说的。。。
Al0rid4l
2023-03-09 08:06:47 +08:00
@yaoyao1128
@kokutou
一开始我就是绝对路径, 不过后来发现似乎没什么区别, 都是报错, 那就索性写短一点了
现在是这样, 还是一样的错误
```
[HKEY_CLASSES_ROOT\Directory\Background\shell\nvimwithoutplugins]
@="Open Neovide here"
"Icon"="C:\\Devtools\\Neovim\\bin\\neovide.exe,0"

[HKEY_CLASSES_ROOT\Directory\Background\shell\nvimwithoutplugins\command]
@="\"C:\Windows\System32\wscript.exe\" \"C:\\Devtools\\Neovim\\bin\\start.vbs\" \"%V\""

```
其实其他的 exe 文件这样添加的右键菜单也都没问题, 就只有 vbs 会提示找不到文件(但文件确实存在路径没错)
yaoyao1128
2023-03-09 08:10:51 +08:00
双斜线
Al0rid4l
2023-03-09 08:24:49 +08:00
@yaoyao1128 眼花了, 不过也没啥区别...这个 reg 文件中的双斜杠导入到了 GUI 的编辑器里和单斜杠一样都变成了单斜杠
感觉不是这么个问题, 因为换其他 exe 都能正常调用, 有没有什么调试让它打印它执行的命令的方法? 这 MS 真是惜字如金, 报错信息说一半就不说了
yaoyao1128
2023-03-09 08:36:08 +08:00
你可以用正斜杠,也可以用双斜杠……但是你这个直接识别不到路径( C:WindowsSystem32wscript.exe )……找不到 wscript.exe 自然没办法运行提示这个。
Al0rid4l
2023-03-09 08:47:37 +08:00
@yaoyao1128 找不到路径的不是 wscript, 因为把 value 单独写成 wscript 是可以打开一个 GUI 的 Windows Script Host Settings 的, 是提示 start.vbs 找不到路径

报错大概是个什么情况呢, 就你随便写个 test.vbs, eg. c:\demo\test.vbs, 打开 Windows explorer 到 demo 目录, 地址栏输入 c:\demo\test.vbs, 可以执行, 把 Windows explorer 切到其他目录, 再输入 c:\demo\test.vbs, 就报错执行不了了. 这个注册表右键菜单就和这个报错一样. 同样的操作, 把 test.vbs 换成一个 test.exe 就没问题.

不理解 vbs 在 Windows 下是有什么特殊机制, 这 vbs 也是现学了点语法糊的.
yaoyao1128
2023-03-09 09:01:50 +08:00
@Al0rid4l 你贴下 vbs 吧(
VDarker
2023-03-09 09:06:43 +08:00
vbs 里 转到脚本所在目录试一下 应该是需要切换工作目录
Al0rid4l
2023-03-09 09:27:03 +08:00
@yaoyao1128 vbs 么, 也就是隐藏一下 bat 的命令行窗口用
```
Set oParameters = WScript.Arguments
If oParameters.Count > 0 Then
CreateObject("Wscript.Shell").Run ".\neovide.bat " + WScript.Arguments(0),0,True
Else
CreateObject("Wscript.Shell").Run ".\neovide.bat",0,True
End If
```
如果还要 bat 的内容
```
start /b c:\devtools\neovim\bin\nvim --listen 127.0.0.1:23333 --headless -u NONE -- %1
c:\devtools\neovim\bin\neovide.exe --remote-tcp 127.0.0.1:23333
```
至于为什么要整这么个东西...大概就是我需要两个右键菜单项打开 Neovide, 一个加载插件一个不加载插件, 然而 Neovide 不支持直接将命令行选项传到 Neovim, 所以只能自己写脚本绕过 Neovide 来传递参数到 Neovim 了. 现在加载插件的右键菜单工作正常, 直接调 neovide.exe 就行, 另一个么就是这个 vbs + bat 脚本了.

不过我觉得这个脚本内容和问题没啥关系就是了, 因为命令行或 GUI 执行 `start.vbs ./` 或 `start.vbs file` 都没什么问题, 仅仅是在这个注册表或者 explorer 地址栏执行才会报错.

@VDarker 根据报错和其他执行成功的情况来看, 应该是系统 /解释器找不到 start.vbs 脚本, 不是 start.vbs 脚本里的代码找不到其他东西, 不然那个报错给的找不到文件的路径(start.vbs 而不是 neovide.bat)就是完完全全误导人了...当然我也不是很懂 vbs 就是了, 等会查下怎么切试试, 如果你能给个具体 API 那更好了
yaoyao1128
2023-03-09 09:41:01 +08:00
.\neovide.bat 绝对路径
你的提示估计是 start.vbs:找不到路径 而不是 无法找到脚本文件“start.vbs”
所以是 start.vbs 的问题了
Al0rid4l
2023-03-09 10:16:11 +08:00
@yaoyao1128 卧槽我的神! 那个报错太迷惑了, 第一行写着 C:\Devtools\Neovim\bin\start.vbs, 第二行写着 The system cannot find the file specified. 原来是这个 vbs 文件里面的报错...

再请教个问题, 现在 %1 或者 %V 参数并没有被传递到 vbs, 看了下 wscript.exe 的文档说要传参数给脚本, 参数前要加 /.

也就是原本

neovide.vbs test.c

的命令, 用 wscript 要写成

wscript neovide.vbs /test.c

这个在命令行下执行也没问题. 但是现在在注册表里写

@="\"C:\\Windows\\System32\\wscript.exe\" \"C:\\Devtools\\Neovim\\bin\\neovide.vbs\" \"/%V\""

/%V 展开后似乎并没有被作为参数传递到 vbs, 导致打开的不是右键菜单所在目录 /文件而是空白文件, 这地方该怎么写呢? 现在是 \"/%V\", 还是 /\"%V\" ? 还是 \"/\"\"%V\" ?
Al0rid4l
2023-03-09 10:21:14 +08:00
@yaoyao1128 啊不用了, 已经试出来了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/922445

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX