您的位置:首页 > 其它

以管理员身份运行脚本一闪而过的原因及解决方法

2011-08-15 23:47 721 查看
一个简单的复制文件的脚本,用于安装软件,在 Win7 下右击以管理员身份运行,竟然一闪而过,虽然脚本中有 pause 。后检查目标目录,毫无疑问自然是复制失败,软件安装失败。死活未能看出来脚本有何问题,因为这脚本本身已经够简单了,而且对于先启动 cmd 再手动启动该脚本的情况没有任何问题。更无语的是后来在多台机器上尝试,竟有部分成功部分失败的现象。估计应该是系统问题,但无论怎样总得要让脚本能够运行起来,事在人为。解决方法倒不复杂,就是显得有些蛋疼,专门建个 install.exe 仅仅就是为了启动同目录下的
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() 也不处理任何特殊字符,若用绝对路径也有可能失败。

===============================================================================

今天又发现更好的方法了,这很适用于自己的系统,因为要修改目标系统,用在别人的机器上得要考虑考虑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐