从上下文菜单中运行位于%AppData%中的.bat文件

当我使用registry项将条目添加到Windows资源pipe理器上下文菜单中时,如下所示:

[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并将registry项更改为

 [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%的子文件夹?

编辑

我使用以下代码在代码中创build了registry项:

 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 

这个工作正常,但是在我右键点击的文件的目录中创build一个命令窗口。 使用任务pipe理器查看进程我看到cmd.exe和conhost.exe进程已创build。 如果我删除命令窗口,这两个进程消失。 有没有什么办法可以自动终止这些进程,而不用按名称杀死它们,这可能会带来不希望的后果。

您的主要问题是%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\"" 

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

我没有看到任何需要在运行时扩展变量,所以我只需输入命令:

在批处理文件中:

 @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