c# - 检测机器中运行的 SQLCMD 的正确方法 - WIX 安装程序先决条件
问题描述
我正在编写一个自定义操作来使用先决条件来检测 SQLCMD 是否在机器上工作。我可以使用下面的代码检查机器上是否有 SQLCMD。
在安装程序中,我们使用 CMDPrompt 来处理 SQLCMD,但如果机器在环境变量中没有 SQLCMD 路径,它将无法工作。但我也想知道为什么 CMDprompt 给出'sqlcmd' is not recognized as an internal or external command error
。
[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;
}
解决方案
最好尽量避免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=""[SQLBINDIR]sqlcmd.exe" -E -S $(var.serverinstance) -V 1 -i "$(var.inputfile)" -o "$(var.outputfile)"" />
推荐阅读
- node.js - 从 mongodb 集合中查找所有具有某些属性值的文档位于数组中
- django - 在 django restframework 中为相关字段创建视图
- javascript - 如何从子组件访问 alpine.js 父组件的属性或方法?
- maven - 如何在maven项目中使用jar文件作为库
- gsm - GSM 模块 USB 端口 更换
- javascript - 用于输入内容以进行反转的制作框
- python - 如何让我的 Python 脚本在 2 小时后运行?
- laravel - Laravel AWS S3 存储图像缓存
- java - 为什么我在尝试通过 OAuth2 连接到 API 时得到 [Not a URI because there is no client] 不是有效的 HTTP URL?
- bootstrap-datepicker - 格式化 bootstrap-datepicker 结果