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

4
当我使用以下注册表项向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进程。如果我关闭了命令窗口,这两个进程都会消失。有没有办法在不使用名称来结束这些进程的情况下自动终止它们,以免引起不必要的后果。

2个回答

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\""

或者,从批处理文件中

    reg.exe add "HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files\command" ^
        /f /ve /t REG_EXPAND_SZ ^
        /d "\"%%AppData%%\FindAlike\AddRightClickFile.bat\" \"%%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

我认为动态扩展的唯一原因是为了确保如果用户重新定位其配置文件,一切都能正常工作,否则您是正确的,它是不必要的。 - MC ND
谢谢您提供这些非常棒的建议 - 非常有帮助。 - SimonKravis
当我将@Compo建议的字符串添加到注册表键时,它会尝试打开我右键单击并选择“类似文件”的文件,而不是写入TestFilePath注册表条目。 - SimonKravis
我的提供的字符串已经经过检查和测试,_(Windows 7英语)。请提供注册表条目的内容,_复制并粘贴,而不是作为注册表导出. - Compo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接