从上下文菜单

时间:2017-06-18 09:17:37

标签: windows batch-file contextmenu

当我使用注册表项向Windows资源管理器上下文菜单添加条目时,如下所示:

[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell]
[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files]
[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files\command]
 @="%AppData%\\FindAlike\\AddRightClickFile.bat  \"%1\""

我收到错误

Windows cannot access the specified device, path or file. You may not have the appropriate permissions to access the item.

如果我将文件AddRightClickFile.bat复制到C:\ Windows \ System32并将注册表项更改为

[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell]
[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files]
[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files\command]
@="AddRightClickFile.bat  \"%1\""

没有错误发生。但是,我想在%Appdata%\ FindAlike中存储AddRightClickFile.bat。

AddRightClickFile.bat中的代码是

reg add  "HKEY_CURRENT_USER\Software\FindAlike"  /f /v "TestFilePath" /t REG_SZ /d  %1

有什么办法可以将.bat文件从上下文菜单命令运行,同时将其存储在%AppData%的子文件夹中?

修改

我使用以下代码在代码中创建了注册表项:

RegistryKey rk = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Classes\*\shell\Similar Files\command");
        string sValue = @"%AppData%\FindAlike\AddRightClickFile.bat ""%1""";
        rk.SetValue("",sValue, RegistryValueKind.ExpandString);

并按如下方式设置AddRightClickFile.bat:

start  
reg add  "HKEY_CURRENT_USER\Software\FindAlike"  /f /v "RightClickFileName"       /t REG_SZ /d  %1 
exit 0

这项工作正常但在我右键单击的文件目录中创建了一个命令窗口。使用任务管理器查看进程,我看到创建了cmd.exe和conhost.exe进程。如果我删除命令窗口,则两个进程都会消失。有没有办法可以自动终止这些进程,而不会通过名称杀死它们,这可能会产生不良后果。

2 个答案:

答案 0 :(得分:4)

您的主要问题是%AppData%被保存为变量引用,但是当读取注册表值时,变量不会扩展为其值。

原因是注册表项的(default)值为REG_SZ类型。如果要存储变量引用并自动扩展其值,则需要注册表项为REG_EXPAND_SZ类型。

所以,你有两个选择

  1. 不要使用变量,请使用完整路径。

  2. 更改注册表项类型。

  3. 第一个选项没有任何问题,但第二个选项无法从regedit完成。从命令行,您可以使用

    reg.exe add "HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files\command" /f /ve /t REG_EXPAND_SZ /d "\"%^AppData%\FindAlike\AddRightClickFile.bat\" \"%1\""
    

    或者,从批处理文件

        reg.exe add "HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files\command" ^
            /f /ve /t REG_EXPAND_SZ ^
            /d "\"%%AppData%%\FindAlike\AddRightClickFile.bat\" \"%%1\""
    

    note :两者之间的唯一区别是转义变量引用

答案 1 :(得分:1)

我根本不认为有必要在运行时扩展变量,所以我只需输入命令:

在批处理文件中:

@REG ADD "HKCU\Software\Classes\*\shell\Similar Files\command" /VE /D "\"%APPDATA%\FindAlike\AddRightClickFile.bat\" \"%%~1\"" /F>NUL

从命令提示符:

REG ADD "HKCU\Software\Classes\*\shell\Similar Files\command" /VE /D "\"%APPDATA%\FindAlike\AddRightClickFile.bat\" \"%~1\"" /F>NUL

<强> [编辑]

如果您已将所有内容放入AddRightClickFile.bat内,那么您可以完全绕过该文件并直接输入信息作为要运行的命令:

从批处理文件:

@REG ADD "HKCU\Software\Classes\*\shell\Similar Files\command" /VE /D "CMD /C \"REG ADD \"HKCU\Software\FindAlike\" /V \"TestFilePath\" /D \"\\\"%%L\\\"\" /F^>NUL\"" /F>NUL