在Windows 10上通过上下文菜单以管理员身份运行cmd命令

时间:2018-08-02 14:28:37

标签: windows batch-file registry contextmenu

我需要一些帮助:我想为我的程序创建一个资源管理器上下文菜单选项(同时右键单击一个文件夹),以使用此.bat文件从上下文菜单中以管理员身份运行该程序:

@ECHO OFF
:: Choose the correct command processor for the current operating system
SET _cmd=
:: Variable to add shortcut to menu entry (NT only,
:: since COMMAND.COM cannot echo an ampersand)
SET _=
ECHO.%COMSPEC% | FIND /I "command.com" >NUL
IF NOT ERRORLEVEL 1 SET _cmd=command.com /e:4096
ECHO.%COMSPEC% | FIND /I "cmd.exe" >NUL
IF NOT ERRORLEVEL 1 SET _cmd=cmd.exe
IF [%_cmd%]==[cmd.exe] SET _=^&
:: Create a temporary .REG file
> %TEMP%.\DEFOPEN.REG ECHO REGEDIT4
>>%TEMP%.\DEFOPEN.REG ECHO.
:Print
ECHO Adding "Explorer context menu option" entry
>>%TEMP%.\DEFOPEN.REG ECHO [HKEY_CLASSES_ROOT\Directory\shell\ourprog]
>>%TEMP%.\DEFOPEN.REG ECHO @="%_%Add to Hot Backup (A.A.T Anti-Ransomware)"
>>%TEMP%.\DEFOPEN.REG ECHO.
>>%TEMP%.\DEFOPEN.REG ECHO [HKEY_CLASSES_ROOT\Directory\shell\ourprog\command]
>>%TEMP%.\DEFOPEN.REG ECHO @="java -jar C:\users\Tamir Naaman\Desktop\A.A.T-Anti-Ransomware.jar -backup \"%%L\"
>>%TEMP%.\DEFOPEN.REG ECHO.
:: If neither COMMAND.COM nor CMD.EXE then skip this step
IF [%_cmd%]==[] GOTO Merge
:: Merge the temporary .REG file
:Merge
START /WAIT REGEDIT /S %TEMP%.\DEFOPEN.REG
:: Delete the temporary .REG file
DEL %TEMP%.\DEFOPEN.REG
:: Ready
GOTO End
:: Clean up variables and quit
:End
SET _cmd=
SET _=

,当我尝试单击上下文菜单中的选项后,出现以下错误消息:
error message

注册表图片:

Registry picture

注册表图片:

Registry picture

我刚刚注意到未设置默认值,我该如何修复我的代码?

您能帮我在批处理文件中找到问题吗?

谢谢您的帮助!

2 个答案:

答案 0 :(得分:1)

以管理员身份执行的“ Directory Shell上下文菜单命令”的注册表设置

要执行上下文菜单命令,请以管理员身份(提升权限)将命令放在特殊动词observeOn下,例如:RunAs

对于目录,通常不使用此特殊动词,但是您永远无法确定,因此完全不建议使用。

推荐的替代选择是使用Static Cascading Menus,它是从Windows 7开始引入的。借助它们,上下文菜单可以使用其自己的专用[HKEY_CURRENT_USER\Software\Classes\Directory\shell\runas\command]动词完全隔离。

利用级联菜单的示例注册表脚本将是

RunAs

您必须确保在Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Classes\Directory\shell\AATCascade] "ExtendedSubCommandsKey"="Directory\\shell\\AATCascade" "MUIVerb"="A.A.T Anti-Ransomware" "HasLUAShield"="" [HKEY_CURRENT_USER\Software\Classes\Directory\shell\AATCascade\shell\runas] "HasLUAShield"="" "MUIVerb"="Add to Hot Backup" [HKEY_CURRENT_USER\Software\Classes\Directory\shell\AATCascade\shell\runas\command] @="java.exe -jar \"C:\\Users\\Tamir Naaman\\Desktop\\A.A.T-Anti-Ransomware.jar\" -backup \"%V\"" 环境变量中定义了java.exe的位置,或指定了PATH的完整路径

级联菜单的优点是,您可以根据需要添加任意数量的命令(使用java.exe以外的自定义动词),并将所有命令保留在级联根菜单下,从而得到更加用户友好和更简洁的上下文菜单。

在每个子菜单下,只能有一个RunAs动词,因此,如果有更多菜单项命令需要提升,则必须通过其他方式将其提升。并且RunAs可用于该任务:PowerShell

当您想添加更多子项并且每个子菜单可以有自己的PowerShell.exe -Command Start-Process "PathToExecutable" 'ExecutableParameters' -Verb RunAs动词时,甚至可以创建嵌套的级联菜单,以使菜单项更加有条理。

完成注册表脚本的测试后,您可以继续下一步并采用注册表脚本从批处理文件导入。

将注册表脚本嵌入到批处理文件中

可以使用三种方法各有其优缺点:

  • 将注册表脚本转换为单独的RunAs命令。优点是您不需要像在注册表脚本中看到的那样转义反斜杠(REG.EXE ADD)和双引号(\),并且在运行时配置注册表设置时更加灵活,例如确定运行时支持文件的位置,并相应地调整注册表设置。但是转换过程繁琐且容易出错。尽管那里有工具可以自动化任务并快速将注册表脚本转换为批处理文件。

  • 在运行时使用"命令将注册表脚本写入临时文件,就像您所做的一样(当然会有错误和错误)。它在环境变量的帮助下,在运行时调整注册表脚本时提供了一定程度的灵活性,但是您必须保留原始注册表脚本的转义语法,并且还必须注意批处理中的特殊字符并对其进行转义。对于小型脚本,这不是问题,但对于大型脚本,它很快就会退出管理。

批处理脚本:

echo


  • 最后一种方法是将注册表脚本复制粘贴到以下批处理脚本的末尾。优点是不需要特殊处理,并且reg脚本可以按原样使用。缺点是注册表脚本是静态的,并且批处理脚本在运行时无法控制内容,因此将按原样导入。

Self Importer BAT / REG脚本:

@echo off
(
    echo REGEDIT4
    echo,
    echo [HKEY_CURRENT_USER\Software\Classes\Directory\shell\AATCascade]
    echo "ExtendedSubCommandsKey"="Directory\\shell\\AATCascade"
    echo "MUIVerb"="A.A.T Anti-Ransomware"
    echo "HasLUAShield"=""
    echo [HKEY_CURRENT_USER\Software\Classes\Directory\shell\AATCascade\shell\runas]
    echo "HasLUAShield"=""
    echo "MUIVerb"="Add to Hot Backup"
    echo [HKEY_CURRENT_USER\Software\Classes\Directory\shell\AATCascade\shell\runas\command]
    echo @=^"java.exe -jar \"C:\\Users\\Tamir Naaman\\Desktop\\A.A.T-Anti-Ransomware.jar\" -backup \"%%V\"^"
)>"%TEMP%\DEFOPEN.REG"

:: First try to import the registry script by REG.EXE to avoid unnecessary elevation if possible.
:: In case all the base keys are HKEY_CURRENT_USER no elevation is required.
REG IMPORT "%TEMP%\DEFOPEN.REG" 2>nul || REGEDIT /S "%TEMP%\DEFOPEN.REG"
del "%TEMP%\DEFOPEN.REG"

最后,您只需要保存扩展名为:: SelfImporter BAT/REG Script @echo off setlocal EnableExtensions DisableDelayedExpansion set "TIME=" set "id=%TIME: =0%" call :getBatFileInfo @f0 @nx0 set "id=%@nx0%.%id:~0,2%%id:~3,2%%id:~6,2%%id:~-2%" set "RegFile=%TEMP%\RegImport.%id%.reg.tmp" ( echo REGEDIT4 echo, type "%@f0%" )>"%RegFile%" && ( echo Importing registry script... REG IMPORT "%RegFile%" 2>nul || REGEDIT /S "%RegFile%" del "%RegFile%" ) pause goto :EOF :getBatFileInfo <f0> <nx0> set "%~1=%~f0" & set "%~2=%~nx0" & exit /b <End of batch script> Windows Registry Editor Version 5.00 The rest the registry script goes here . . 的批处理脚本,而不必担心.CMD

答案 1 :(得分:-1)

要获取我假设您想要进入注册表的信息,您的脚本可能看起来应该像这样:

@ECHO OFF
(   ECHO REGEDIT4
    ECHO(
    ECHO [HKEY_CURRENT_USER\Software\Classes\Directory\shell\ourprog]
    ECHO @="Add to Hot Backup (A.A.T Anti-Ransomware)"
    ECHO(
    ECHO [HKEY_CURRENT_USER\Software\Classes\Directory\shell\ourprog\command]
    ECHO @="java -jar \"C:\\Users\\Tamir Naaman\\Desktop\\A.A.T-Anti-Ransomware.jar\" -backup \"%%V\""
    ECHO()>"%TEMP%\DEFOPEN.REG"
REGEDIT /S "%TEMP%\DEFOPEN.REG"
DEL "%TEMP%\DEFOPEN.REG"

您有责任确保未指定完整路径的java命令在目标环境中正常工作。

您会注意到我已经使用了用户密钥,因为不需要在PC上为每个用户使用密钥,尤其是当jar文件位于特定用户配置文件树中时