V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Al0rid4l
V2EX  ›  Windows

求解一个注册表的问题

  •  
  •   Al0rid4l · 2023-03-09 07:07:16 +08:00 · 1410 次点击
    这是一个创建于 625 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在我有这么一个注册表项, 希望添加一个目录空白处右键菜单, 调用一个 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 脚本也没问题, 只有写在注册表里的命令有问题, 求解是什么原因?

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

    yaoyao1128
        1
    yaoyao1128  
       2023-03-09 07:19:02 +08:00 via iPhone
    用 wscript.exe 的绝对路径
    kokutou
        2
    kokutou  
       2023-03-09 07:33:26 +08:00 via Android
    这种问题英文在 Google 搜,
    explorer rightclick menu Background command not found

    第一个 stackoverflow 就有答案和注意事项,注意事项就有 1 楼说的。。。
    Al0rid4l
        3
    Al0rid4l  
    OP
       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
        4
    yaoyao1128  
       2023-03-09 08:10:51 +08:00 via iPhone
    双斜线
    Al0rid4l
        5
    Al0rid4l  
    OP
       2023-03-09 08:24:49 +08:00
    @yaoyao1128 眼花了, 不过也没啥区别...这个 reg 文件中的双斜杠导入到了 GUI 的编辑器里和单斜杠一样都变成了单斜杠
    感觉不是这么个问题, 因为换其他 exe 都能正常调用, 有没有什么调试让它打印它执行的命令的方法? 这 MS 真是惜字如金, 报错信息说一半就不说了
    yaoyao1128
        6
    yaoyao1128  
       2023-03-09 08:36:08 +08:00 via iPhone
    你可以用正斜杠,也可以用双斜杠……但是你这个直接识别不到路径( C:WindowsSystem32wscript.exe )……找不到 wscript.exe 自然没办法运行提示这个。
    Al0rid4l
        7
    Al0rid4l  
    OP
       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
        8
    yaoyao1128  
       2023-03-09 09:01:50 +08:00 via iPhone
    @Al0rid4l 你贴下 vbs 吧(
    VDarker
        9
    VDarker  
       2023-03-09 09:06:43 +08:00
    vbs 里 转到脚本所在目录试一下 应该是需要切换工作目录
    Al0rid4l
        10
    Al0rid4l  
    OP
       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
        11
    yaoyao1128  
       2023-03-09 09:41:01 +08:00   ❤️ 1
    .\neovide.bat 绝对路径
    你的提示估计是 start.vbs:找不到路径 而不是 无法找到脚本文件“start.vbs”
    所以是 start.vbs 的问题了
    Al0rid4l
        12
    Al0rid4l  
    OP
       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
        13
    Al0rid4l  
    OP
       2023-03-09 10:21:14 +08:00
    @yaoyao1128 啊不用了, 已经试出来了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2749 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 12:47 · PVG 20:47 · LAX 04:47 · JFK 07:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.