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

求解一个注册表的问题

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

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

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

    yaoyaomoe
        1
    yaoyaomoe  
       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 会提示找不到文件(但文件确实存在路径没错)
    yaoyaomoe
        4
    yaoyaomoe  
       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 真是惜字如金, 报错信息说一半就不说了
    yaoyaomoe
        6
    yaoyaomoe  
       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 也是现学了点语法糊的.
    yaoyaomoe
        8
    yaoyaomoe  
       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 那更好了
    yaoyaomoe
        11
    yaoyaomoe  
       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     Solana     2680 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 09:15 PVG 17:15 LAX 01:15 JFK 04:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86