Board logo

标题: [系统相关] 批处理为何以管理员权限运行闪退 [打印本页]

作者: freesoft00    时间: 2018-9-1 15:09     标题: 批处理为何以管理员权限运行闪退

批处理文件名称如下:
第一次请先运行(64位).cmd
内容如下:
  1. @echo off
  2. copy *.dll                  %windir%\SysWOW64 /y
  3. copy *.ocx                  %windir%\SysWOW64 /y
  4. %windir%\SysWOW64\regsvr32 midas.dll
  5. %windir%\SysWOW64\regsvr32 Biokey.ocx
  6. %windir%\SysWOW64\regsvr32 VisualCard.ocx
复制代码
32位的是copy到system32,这个批处理改名比如改名为www.cmd,右键以管理员权限运行没有问题,不改名双击运行就闪退,打开cmd命令行,然后运行这个批处理也没有问题。
不知道是什么原因。
作者: 老刘1号    时间: 2018-9-1 15:16

pushd "%~dp0"
cd/d "%~dp0"
(%~d0)&cd "%~p0"
任选
作者: freesoft00    时间: 2018-9-1 15:30

回复 2# 老刘1号


    兄弟这个没有用的。已经试过了。
作者: freesoft00    时间: 2018-9-1 15:32

本帖最后由 freesoft00 于 2018-9-1 15:36 编辑

改名,双击,右键管理员运行,cmd中运行都可以。
不改名,双击可以,cmd中可以,右键管理员运行不行。
Administrator用户登录,uac状态是禁用状态。

昨天的一台机器是uac启用状态,也是同样的问题,代码我是实在没有看到有哪里问题,没有错误提示,cmd中运行时正常的。一开始就先加大pushd
批处理文件编码也是ansi

两天电脑都安装了sql 2005,一台有杀毒软件,一台是vmware虚拟系统裸机。
下面是这台电脑的环境变量:
C:\Users\Administrator>path
PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32
\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Microsoft SQL Server\80\Tools\Bi
nn\;C:\Program Files\Microsoft SQL Server\90\Tools\binn\;C:\Program Files (x86)\
Microsoft SQL Server\90\Tools\binn\;C:\Program Files (x86)\Microsoft SQL Server\
90\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server\90\Tools\Binn\VSShell\C
ommon7\IDE\;C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\IDE\Private
Assemblies\
作者: 老刘1号    时间: 2018-9-1 15:36

回复 4# freesoft00


    改的啥名?
bat名不要和外部命令名重复
作者: freesoft00    时间: 2018-9-1 16:59

回复 5# 老刘1号


    任意,wwee.bat 3344.cmd 好吧.cmd,什么都可以,唯独 第一次请先运行(32位).cmd  第一次请先运行(64位).cmd 不行
作者: /zhqsystem/zhq    时间: 2018-9-1 20:42

去掉括号就好了
作者: freesoft00    时间: 2018-9-1 22:14

回复 7# /zhqsystem/zhq


    恩,确实是英文括号的问题,不知道为什么会这样呢?
作者: freesoft00    时间: 2018-9-2 14:16

回复 7# /zhqsystem/zhq


    想了想还是有点疑问。
去掉括号也属于改名了。
不改名有括号的时候为什么双击可以正常运行,在cmd中也可以正常运行。
作者: /zhqsystem/zhq    时间: 2018-9-2 19:58

回复 9# freesoft00
不知道为什么,不过可以考虑在用一个批获取权限来调用这个,建议用内置区分标签goto或call调用自身
示例
if /i "%Processor_Architecture:~-2%"=="64" (call:NTX64)ELSE call:NTX86
作者: WHY    时间: 2018-9-3 09:16

本帖最后由 WHY 于 2018-9-3 11:10 编辑

bat 文件右键 "以管理员身份运行" 由注册表项:HKEY_CLASSES_ROOT\batfile\shell\runas\command 控制,其默认值为:
%SystemRoot%\System32\cmd.exe /C "%1" %*
cmd 文件对应的注册表项是: cmdfile

虽然参数 %1 被引号包裹,但注册表程序会把引号脱去(如果没有空格的话),再把它当作 CMD 的参数,交给 CMD 处理。
CMD 在遇到小括弧、& 等字符的参数时,不会在参数外层自动补上引号,导致解析错误而闪退。

如果不希望修改路径或文件名,可以考虑修改对应的注册表值,再加一对双引号:
%SystemRoot%\System32\cmd.exe /C ""%1"" %*

该办法在Win10 v1803 中文专业版,Win7 sp1 中文旗舰版测试通过
作者: freesoft00    时间: 2018-9-3 13:09

回复 11# WHY


    一楼倒没有必须使用那个名称的问题。
只是想弄明白这个问题,不能不求甚解就过去了。
多谢详细解释了!
作者: freesoft00    时间: 2018-9-3 16:40

回复 11# WHY


    那么类似的问题,网上的那些右键获取管理员权限的右键菜单,我看注册表的命令是:
cmd.exe /c takeown /f "%1" /r /d y && icacls "%1" /grant administrators:f /t
其中的%1也可以添加两个双引号是不是?都可以这样处理。
作者: WHY    时间: 2018-9-4 10:34

回复 13# freesoft00


    楼主要是对这个话题感兴趣,就请亲自测试一下,然后把你测试使用的环境、数据、方法、结果分享出来呗。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2