【问题标题】:Running a .bat file located in %AppData% from context menu从上下文菜单运行位于 %AppData% 中的 .bat 文件
【发布时间】:2017-06-18 09:17:36
【问题描述】:

当我使用以下注册表条目向 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\""

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

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 进程。如果我删除命令窗口,两个进程都会消失。有什么方法可以自动终止这些进程而不用名字杀死它们,这可能会产生不良后果。

【问题讨论】:

    标签: windows batch-file contextmenu


    【解决方案1】:

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

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

    所以,你有两个选择

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

    2. 更改注册表项类型。

    第一个选项没有问题,但第二个不能从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\""
    

    注意:两者的唯一区别是变量引用的转义

    【讨论】:

      【解决方案2】:

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

      在批处理文件中:

      @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
      

      【讨论】:

      • 我看到动态扩展的唯一原因是,如果用户重新定位他们的个人资料,可以保持一切正常,否则你是对的,不需要。
      • 感谢您提供一些很棒的建议 - 非常有帮助
      • 当我将@Compo 建议的字符串添加到注册表项时,它会尝试打开我右键单击并选择了类似文件的文件,并且不会写入 TestFilePath 注册表项
      • 我提供的字符串已经过检查和测试工作,(Windows 7 英语)。请提供注册表项的内容,复制并粘贴,而不是作为注册表导出.
      猜你喜欢
      • 1970-01-01
      • 2011-09-03
      • 2019-06-02
      • 2012-03-08
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多