C# 检测机器中运行的SQLCMD的正确方法-WIX安装程序的先决条件

C# 检测机器中运行的SQLCMD的正确方法-WIX安装程序的先决条件,c#,wix,C#,Wix,我正在编写一个自定义操作,以使用预先要求来检测SQLCMD是否在机器上工作。我可以使用下面的代码检查机器上是否有SQLCMD 在安装程序中,我们使用CMDPrompt处理SQLCMD,但是如果机器在环境变量中没有SQLCMD路径,它将无法工作。但我还想知道为什么CMDprompt给出的“sqlcmd”未被识别为内部或外部命令错误 [CustomAction] public static ActionResult FindSqlCMD(Session session)

我正在编写一个自定义操作,以使用预先要求来检测SQLCMD是否在机器上工作。我可以使用下面的代码检查机器上是否有SQLCMD

在安装程序中,我们使用CMDPrompt处理SQLCMD,但是如果机器在环境变量中没有SQLCMD路径,它将无法工作。但我还想知道为什么CMDprompt给出的
“sqlcmd”未被识别为内部或外部命令错误

[CustomAction]
        public static ActionResult FindSqlCMD(Session session)
        {
            DebugMsg(session, "Start FindSqlCMD");
            string[] sqlVersions = session["SQLVERSIONS"].Split(';');

            List<RegistryKey> sqlKeys = new List<RegistryKey>();

            var sqlDacPaths = new string[] { "C:\\Program Files (x86)\\Microsoft SQL Server\\{0}\\DAC\\bin", "C:\\Program Files\\Microsoft SQL Server\\{0}\\DAC\\bin" };

            var sqlPackageName = "SqlPackage.exe";

            foreach (string SqlVersion in sqlVersions)
            {


                foreach (var sqlDacPath in sqlDacPaths)
                {
                    var path = string.Format(sqlDacPath, SqlVersion);



                    if (Directory.Exists(path))
                    {

                        var sqlPackagePath = Path.Combine(path, sqlPackageName);

                        if (File.Exists(sqlPackagePath))
                        {


                            session["SQLBINDIR"] = sqlPackagePath;
                            return ActionResult.Success;
                        }
                    }
                }
            }

            DebugMsg(session, string.Format("Didn't find any SQL DAC SQLPackage"));

            session.Log("End FindSqlCMD");
            return ActionResult.Success;
        }
[自定义操作]
公共静态操作结果FindSqlCMD(会话)
{
DebugMsg(会话,“启动FindSqlCMD”);
字符串[]sqlVersions=会话[]“sqlVersions”].Split(“;”);
List sqlKeys=new List();
var sqlDacPaths=新字符串[]{“C:\\ProgramFiles(x86)\\Microsoft SQL Server\\{0}\\DAC\\bin”,“C:\\ProgramFiles\\Microsoft SQL Server\\{0}\\DAC\\bin”};
var sqlPackageName=“SqlPackage.exe”;
foreach(sqlVersions中的字符串SqlVersion)
{
foreach(sqlDacPath中的var sqlDacPath)
{
var path=string.Format(sqlDacPath,SqlVersion);
if(目录存在(路径))
{
var sqlPackagePath=Path.Combine(Path,sqlPackageName);
if(File.Exists(sqlPackagePath))
{
会话[“SQLBINDIR”]=sqlPackagePath;
返回操作结果。成功;
}
}
}
}
DebugMsg(session,string.Format(“未找到任何SQL DAC SQLPackage”);
Log(“End FindSqlCMD”);
返回操作结果。成功;
}

最好尽量避免
exe
自定义操作。可能的解决方案是通过WiX查找sqlcmd:

 <!-- Find sqlcmd.exe path  -->
<Property Id="SQLBINDIR">
  <RegistrySearch Id="SqlBinDir11x64" 
                  Root="HKLM" Key="SOFTWARE\Microsoft\Microsoft SQL Server\110\Tools\ClientSetup" 
                  Name="Path" 
                  Type="raw" Win64="yes" />
  <RegistrySearch Id="SqlBinDir10x64" 
                  Root="HKLM" Key="SOFTWARE\Microsoft\Microsoft SQL Server\100\Tools\ClientSetup" 
                  Name="Path" 
                  Type="raw" Win64="yes" />
  <RegistrySearch Id="SqlBinDir90x64" 
                  Root="HKLM" Key="SOFTWARE\Microsoft\Microsoft SQL Server\90\Tools\ClientSetup" 
                  Name="Path" 
                  Type="raw" Win64="yes" />
  <RegistrySearch Id="SqlBinDir11" 
                  Root="HKLM" Key="SOFTWARE\Microsoft\Microsoft SQL Server\110\Tools\ClientSetup" 
                  Name="Path" 
                  Type="raw" />
  <RegistrySearch Id="SqlBinDir10" 
                  Root="HKLM" Key="SOFTWARE\Microsoft\Microsoft SQL Server\100\Tools\ClientSetup" 
                  Name="Path" 
                  Type="raw" />
  <RegistrySearch Id="SqlBinDir90" 
                  Root="HKLM" Key="SOFTWARE\Microsoft\Microsoft SQL Server\90\Tools\ClientSetup" 
                  Name="Path" 
                  Type="raw" />

</Property>

然后你就可以运行它了

 <CustomAction Id="sqlcmd.cmd" 
              Property="sqlcmd" 
              Value="&quot;[SQLBINDIR]sqlcmd.exe&quot; -E -S $(var.serverinstance) -V 1 -i &quot;$(var.inputfile)&quot; -o &quot;$(var.outputfile)&quot;" />


感谢您的输入。但有时SQLCMD在计算机中,但无法在CMDPrompt中运行,因为SQLCMD路径未在环境变量中设置。在WIX安装程序中如何处理。我正在执行类似以下操作:var StartInfo=new ProcessStartInfo();StartInfo.FileName=“SQLCMD.EXE”;StartInfo.WindowStyle=ProcessWindowStyle.Hidden;var进程=进程启动(StartInfo);process.WaitForExit();如果(process.ExitCode==9009){session.Message(InstallMessage.Error+(int)MessageBoxIcon.Error+(int)MessageBoxButtons.OK,则新记录{FormatString=“'SQLCMD'未识别为内部或外部命令”});返回ActionResult.Failure;}