以管理员身份运行时 CMD 文件闪现

以管理员身份运行时 CMD 文件闪现

以管理员身份运行一个简单的批处理文件(.cmd)(右键单击-->以管理员身份运行)时,它只是在任务栏中闪烁,没有发生任何其他事情。

只需双击运行文件就可以了。

.cmd 文件的总内容:

@echo off
set /p DUMMY=Done executing...

事件查看器中没有日志或我发现的错误消息...有什么想法可以尝试吗?

答案1

空格、与号、管道符等字符在 Windows 命令行中具有特殊含义,应逃脱。 右键点击以管理员身份运行可以为特定可执行文件PATHEXT相应注册表项中的文件类型(变量中的扩展名)-HKEY_CLASSES_ROOT\cmdfile例如HKEY_CLASSES_ROOT\batfileWindowscmd脚本:

assoc .cmd & assoc .bat
.cmd=cmdfile
.bat=batfile

右键点击以管理员身份运行这些文件类型的操作是起初定义如下:

reg query "HKEY_CLASSES_ROOT\cmdfile\Shell\runas\command"
reg query "HKEY_CLASSES_ROOT\batfile\Shell\runas\command"
HKEY_CLASSES_ROOT\cmdfile\Shell\runas\command
    (Default)    REG_EXPAND_SZ    %SystemRoot%\System32\cmd.exe /C "%1" %*

HKEY_CLASSES_ROOT\batfile\Shell\runas\command
    (Default)    REG_EXPAND_SZ    %SystemRoot%\System32\cmd.exe /C "%1" %*

不幸的是,双引号被删掉了(见cmd /?):

如果指定了/C/K,则开关后的命令行其余部分将作为命令行进行处理,其中使用以下逻辑来处理引号(")字符:
...
旧行为是查看第一个字符是否为引号字符,如果是,则删除前导字符并删除命令行上的最后一个引号字符,保留最后一个引号字符后的任何文本。

因此,我们需要调用以下命令:

%SystemRoot%\System32\cmd.exe /C ""%1" %*"
rem                              ↑       ↑

为此,打开升高命令提示符并运行以下命令(同时运行reg add命令,batfile予以适当修改):

set auxvar=^%SystemRoot^%\System32\cmd.exe
reg add "HKEY_CLASSES_ROOT\cmdfile\Shell\runas\command" /ve /t REG_EXPAND_SZ /d "%auxvar% /C \"\"%1\" %*\"" /f
The operation completed successfully.
reg query "HKEY_CLASSES_ROOT\cmdfile\Shell\runas\command"
HKEY_CLASSES_ROOT\cmdfile\Shell\runas\command
    (Default)    REG_EXPAND_SZ    %SystemRoot%\System32\cmd.exe /C ""%1" %*"

如果您更喜欢通过.bat.cmd脚本执行此操作,则reg add命令应如下所示:

reg add "HKEY_CLASSES_ROOT\cmdfile\Shell\runas\command" /ve /t REG_EXPAND_SZ /d "%%SystemRoot%%\System32\cmd.exe /C \"\"%%1\" %%*\"" /f

答案2

这是因为文件所在的路径。路径不能包含“&”符号,并且“@”和空格的组合也不起作用:

C:/temp/test.cmd-作品!

C:/temp&/test.cmd——不起作用!

C:/temp &/test.cmd——不起作用!

C:/temp@/test.cmd-作品!

C:/temp @/test.cmd——不起作用!

有道理吧?:) Windows 错误...

相关内容