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

Sim*_*vis 5 windows contextmenu batch-file

当我使用以下注册表项将条目添加到 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\""
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

Windows cannot access the specified device, path or file. You may not have the appropriate permissions to access the item.
Run Code Online (Sandbox Code Playgroud)

如果我将文件 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\""
Run Code Online (Sandbox Code Playgroud)

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

AddRightClickFile.bat 中的代码是

reg add  "HKEY_CURRENT_USER\Software\FindAlike"  /f /v "TestFilePath" /t REG_SZ /d  %1
Run Code Online (Sandbox Code Playgroud)

有什么方法可以让 .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);
Run Code Online (Sandbox Code Playgroud)

并设置 AddRightClickFile.bat 如下:

start  
reg add  "HKEY_CURRENT_USER\Software\FindAlike"  /f /v "RightClickFileName"       /t REG_SZ /d  %1 
exit 0
Run Code Online (Sandbox Code Playgroud)

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

MC *_* ND 5

您的主要问题是它%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\""
Run Code Online (Sandbox Code Playgroud)

或者,从批处理文件

    reg.exe add "HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files\command" ^
        /f /ve /t REG_EXPAND_SZ ^
        /d "\"%%AppData%%\FindAlike\AddRightClickFile.bat\" \"%%1\""
Run Code Online (Sandbox Code Playgroud)

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