代码之家  ›  专栏  ›  技术社区  ›  andy_work

执行SQLcmd,然后将查询结果作为变量返回给NSIS

  •  0
  • andy_work  · 技术社区  · 6 年前

    我正在创建一个NSIS安装程序,需要获取用户安装的SQL server版本。

    用户将为我提供实例名称,以便我可以连接到该框。然后我运行这个sql查询,选择SERVERPROPERTY('ProductMajorVersion'),并获取主要版本号。

    但当我尝试从NSIS执行时,我没有成功,因为它在执行查询时出错,所以我无法从控制台窗口获得结果。

    以下是我在NSIS文件中的内容:

    nsExec::ExecToStack "'sqlcmd -S $SQL_Instance_Name -E -h-1 -Q $\"SET NOCOUNT ON; select SERVERPROPERTY ($\'ProductMajorVersion$\')$\"'"
    
        Pop $0
        Pop $1
    

    我也尝试过:

    ExecCmd::Exec  "'sqlcmd -S $SQL_Instance_Name -E -h-1 -Q $\"SET NOCOUNT ON; 
    select SERVERPROPERTY ($\'ProductMajorVersion$\')$\"'"
    
        Pop $0
        Pop $1
    

    但我只是没有得到我想要的结果任何建议或建议将不胜感激。

    或者,如果有更简单、更快的方法从注册表中获取此信息,那么也可以。

    TIA公司 安迪

    1 回复  |  直到 6 年前
        1
  •  1
  •   Anders    6 年前

    应使用完整路径指定应用程序,并且需要 quoted with a double quotes :

    为了确保在所有windows版本上执行命令时不会出现问题, 建议使用以下语法:

    nsExec::ExecToStack [OPTIONS] '"PATH" param1 param2 paramN'

    Section
    StrCpy $0 "-S $SQL_Instance_Name ....." ; Putting the parameters here makes them easier to debug etc
    MessageBox mb_ok $0 ; Use this to make sure the parameters look correct
    nsExec::ExecToStack '"c:\path\to\sqlcmd.exe" $0'
    Pop $0
    Pop $1
    DetailPrint $0,$1 ; $0 will be "error" if nsExec cannot start the application
    SectionEnd