c# 自定义安装包中为何不执行bat文件

时间:2022-08-30 20:52:33
我在自定义安装包的安装类中加入了通过执行bat文件自动刷库的代码,如下

public override void Install(System.Collections.IDictionary stateSaver)
        {
            base.Install(stateSaver);
            System.Diagnostics.Debugger.Launch(); 
            physicaldir = this.Context.Parameters["targetdir"].ToString();  //安装路径  
            physicaldir = physicaldir.Substring(0, physicaldir.Length - 1);
            dbserver = this.Context.Parameters["dbserver"].ToString();  //数据库服务器名称
            string dbname = dbserver;
            if (string.IsNullOrEmpty(dbname))
            {
                throw new Exception("数据库服务器地址不能为空。");
            }
            if (!ExistSqlServerService(dbname))
            {
                throw new Exception("数据库服务器地址有误或您填写的数据库服务器上不存在SQLSERVER数据库。");
            }
            
            string strFilePath = Path.Combine(physicaldir, @"sql.bat");
            if (File.Exists(strFilePath))
            {
                string strContent = File.ReadAllText(strFilePath);
                strContent = Regex.Replace(strContent, "IP", dbname);
                File.WriteAllText(strFilePath, strContent);



                Process p = new Process();
                p.StartInfo.FileName = strFilePath;  
                p.StartInfo.UseShellExecute = false;  
                p.StartInfo.RedirectStandardInput = true;  
                p.StartInfo.RedirectStandardOutput = true;  
                p.StartInfo.CreateNoWindow = true;  
                p.Start();   
                p.WaitForExit();
            }
            else
            {
                throw new Exception("安装目录下不存在刷库脚本。");
            }

        }
        #endregion

        #region 自定义检测当前机器是否安装SQL2000方法
        public static bool ExistSqlServerService(string dbname)
        {
            bool ExistFlag = false;
            ServiceController sc = new ServiceController("MSSQLSERVER", dbname);
            if (sc.Status == ServiceControllerStatus.Running)
            {
                ExistFlag = true;
            }
            return ExistFlag;
            
        }
        #endregion

在安装过程中虽然也执行通过了所有的代码,可是数据库中应该要建的数据库始终没有建。我把代码放到界面的按钮事件里面,通过点击按钮执行上面的代码可以bat文件建立数据库。请问两者有何不同,为什么安装时候执行了代码还是不能建数据库?

11 个解决方案

#1


试试看以管理员身份运行安装文件看看

#2


如何默认让用户以管理员用户执行呢?

#3


你把 p.StartInfo.UseShellExecute = false; 先注释掉,看看命令窗口里都是些什么

#4


引用 3 楼 xuzuning 的回复:
你把 p.StartInfo.UseShellExecute = false; 先注释掉,看看命令窗口里都是些什么

报错:要重定向 IO 流,Process 对象必须将 UseShellExecute 属性设置为 False。

#5


引用 2 楼 xuefeng_zzg的回复:
如何默认让用户以管理员用户执行呢?

一个程序未经使用者同意便自动以管理员身份运行,那么安全性肯定荡然无存了。

#6


不过,如果你的问题却因用户权限导致,那么你可以在安装时先判断一些只有管理员才能取得的操作系统信息,如果未取到,或者从信息中可以判断为非管理员,那么可以提示用户需要以管理员身份运行安装软件。

#7


没用,似乎跟是否是管理员运行无关。应该是别的问题。

#8


引用 楼主 xuefeng_zzg 的回复:
在安装过程中虽然也执行通过了所有的代码,可是数据库中应该要建的数据库始终没有建。我把代码放到界面的按钮事件里面,通过点击按钮执行上面的代码可以bat文件建立数据库。请问两者有何不同,为什么安装时候执行了代码还是不能建数据库?


你是怎样确定“执行通过了所有的代码”的?没有抛出异常就算是执行了所有代码?

#9


调试状态下都执行通过了

#10


求解答。。。。。。。

#11


已解决,应该是执行文件路径的问题,用以下代码解决
Process pro = new Process();
                FileInfo file = new FileInfo(strFilePath);
                pro.StartInfo.WorkingDirectory = file.Directory.FullName;
                pro.StartInfo.FileName = strFilePath;
                pro.StartInfo.CreateNoWindow = false;
                pro.Start();
                pro.WaitForExit();

#1


试试看以管理员身份运行安装文件看看

#2


如何默认让用户以管理员用户执行呢?

#3


你把 p.StartInfo.UseShellExecute = false; 先注释掉,看看命令窗口里都是些什么

#4


引用 3 楼 xuzuning 的回复:
你把 p.StartInfo.UseShellExecute = false; 先注释掉,看看命令窗口里都是些什么

报错:要重定向 IO 流,Process 对象必须将 UseShellExecute 属性设置为 False。

#5


引用 2 楼 xuefeng_zzg的回复:
如何默认让用户以管理员用户执行呢?

一个程序未经使用者同意便自动以管理员身份运行,那么安全性肯定荡然无存了。

#6


不过,如果你的问题却因用户权限导致,那么你可以在安装时先判断一些只有管理员才能取得的操作系统信息,如果未取到,或者从信息中可以判断为非管理员,那么可以提示用户需要以管理员身份运行安装软件。

#7


没用,似乎跟是否是管理员运行无关。应该是别的问题。

#8


引用 楼主 xuefeng_zzg 的回复:
在安装过程中虽然也执行通过了所有的代码,可是数据库中应该要建的数据库始终没有建。我把代码放到界面的按钮事件里面,通过点击按钮执行上面的代码可以bat文件建立数据库。请问两者有何不同,为什么安装时候执行了代码还是不能建数据库?


你是怎样确定“执行通过了所有的代码”的?没有抛出异常就算是执行了所有代码?

#9


调试状态下都执行通过了

#10


求解答。。。。。。。

#11


已解决,应该是执行文件路径的问题,用以下代码解决
Process pro = new Process();
                FileInfo file = new FileInfo(strFilePath);
                pro.StartInfo.WorkingDirectory = file.Directory.FullName;
                pro.StartInfo.FileName = strFilePath;
                pro.StartInfo.CreateNoWindow = false;
                pro.Start();
                pro.WaitForExit();