以管理员身份运行脚本一闪而过的原因及解决方法
2011-08-15 23:47
721 查看
一个简单的复制文件的脚本,用于安装软件,在 Win7 下右击以管理员身份运行,竟然一闪而过,虽然脚本中有 pause 。后检查目标目录,毫无疑问自然是复制失败,软件安装失败。死活未能看出来脚本有何问题,因为这脚本本身已经够简单了,而且对于先启动 cmd 再手动启动该脚本的情况没有任何问题。更无语的是后来在多台机器上尝试,竟有部分成功部分失败的现象。估计应该是系统问题,但无论怎样总得要让脚本能够运行起来,事在人为。解决方法倒不复杂,就是显得有些蛋疼,专门建个 install.exe 仅仅就是为了启动同目录下的
install.cmd ,你说什么感觉!
附 install.c
===============================================================================
后记:
根本原因找到了,在于脚本所在路径存在一些对于 cmd /c 来说的“特殊字符”。具体哪些是特殊字符可在 cmd 帮助中查到,其中就包括空格,所以稍有不慎放错地方就会出问题。
由此可推断,右击以管理员身份运行在调用 cmd.exe 时只是简单地将脚本绝对路径直接作为参数传了过去,并未进行加引号等处理,也没用我所写的先切换目录再用相对路径运行脚本的方法。
其实 system() 也不处理任何特殊字符,若用绝对路径也有可能失败。
===============================================================================
今天又发现更好的方法了,这很适用于自己的系统,因为要修改目标系统,用在别人的机器上得要考虑考虑。
install.cmd ,你说什么感觉!
附 install.c
#include <stdio.h> #include <stdlib.h> #include <limits.h> #include <unistd.h> #include <windows.h> #ifndef _WIN64 // 退出进程,若在 64 位系统上运行的话 void EXIT_IF_WOW64() { typedef BOOL (WINAPI *is_wow64_type)(HANDLE, PBOOL); is_wow64_type is_wow64; BOOL wow64 = FALSE; is_wow64 = (is_wow64_type)GetProcAddress( GetModuleHandle(TEXT("kernel32")), "IsWow64Process" ); if(is_wow64 != NULL) is_wow64(GetCurrentProcess(), &wow64); if(wow64) { printf( "This program must run on x86 systems." " Plese any key to end.\n" ); system("pause > nul"); exit(-1); } } #else #define EXIT_IF_WOW64() #endif // _WIN64 // 脚本相对路径 const char *InsCmdFile = ".\\install.cmd"; int main() { char *p; char *path=(char *)malloc(PATH_MAX); EXIT_IF_WOW64(); if(GetModuleFileName(NULL, path, PATH_MAX) == 0) { printf("Error! Path is too long!"); return 1; } for(p=path; *p!='\0'; ++p); for(--p; *p!='\\'; --p) { if(p<path) { printf("Error!"); return 2; } } *p='\0'; printf("chdir /d \"%s\"\n%s\n", path, InsCmdFile); chdir(path); system(InsCmdFile); return 0; }
===============================================================================
后记:
根本原因找到了,在于脚本所在路径存在一些对于 cmd /c 来说的“特殊字符”。具体哪些是特殊字符可在 cmd 帮助中查到,其中就包括空格,所以稍有不慎放错地方就会出问题。
由此可推断,右击以管理员身份运行在调用 cmd.exe 时只是简单地将脚本绝对路径直接作为参数传了过去,并未进行加引号等处理,也没用我所写的先切换目录再用相对路径运行脚本的方法。
其实 system() 也不处理任何特殊字符,若用绝对路径也有可能失败。
===============================================================================
今天又发现更好的方法了,这很适用于自己的系统,因为要修改目标系统,用在别人的机器上得要考虑考虑。
相关文章推荐
- regSvr32 脚本注册避开“以管理员身份运行”权限注册失败的解决方法
- bash脚本运行报错问题原因及解决方法
- 解决Win7系统下以管理员身份运行的程序接收不到拖放文件消息[WM_DROPFILES]问题的方法
- 如何以管理员身份运行cmd及解决方法:An error occurred on the server when processing the URL. Please contact the syste
- 解决win7的ie8浏览器以管理员身份运行,才不会崩溃的方法
- 解决系统下以管理员身份运行的程序接收不到拖放文件消息[WM_DROPFILES]问题的方法
- 关于Windows_8.1/Windows 7下普通用户运行软件提示需要输入管理员密码解决方法
- 解决win7下IE10只能以管理员身份运行
- Servlet运行原理及404、500、405异常原因和解决方法总结
- win7中以管理员身份运行bat脚本时,获取当前文件所在目录
- 在VS.net(C#)里,设置程序在启动时默认"以管理员身份运行"的方法
- Windows下运行python脚本报错“ImportError: No Module named ...”的解决方法
- 基于Selenium的Web自动化测试脚本在IE上运行慢的解决方法
- PowerShell 2.0 脚本无法运行问题解决方法
- vs2010 生成的exe文件不能运行 一闪而过 缺少mfc100.dll, xxx100d.dll等的解决方法
- ecshop 突然运行很慢的原因 ecshop数据库ecs_stats总是很大的解决方法
- PowerShell脚本无法运行问题解决方法
- win7 批处理文件默认以管理员身份运行及清除IE缓存脚本
- 解决IE10只能用管理员身份运行
- ubuntu12.04中shell脚本无法使用source的原因及解决方法