【问题标题】:inno setup exec sqlcmd command problems with files path with spaces带有空格的文件路径的inno setup exec sqlcmd命令问题
【发布时间】:2014-10-27 10:58:01
【问题描述】:

我正在尝试使用 inno setup 执行 2 个脚本。 我认为的问题是包含空格的文件的路径。 这些脚本正在运行,因为我已经尝试了没有空格的硬编码路径并且它确实有效。 有这篇文章描述了这个问题并添加了解决方案,但我已经尝试过但它不起作用。 这是主题Inno Setup, spaces and double quote in [Run]

为了不使用硬编码路径,我使用了 inno 设置常量,所以在输出文件夹上我有一个 setup.exe 和一个名为 testfolder 的文件夹,其中包含 2 个脚本,一个用于创建数据库,另一个用于创建表。 在 inno setup 中这样做了

connExe:=ExpandConstant('{tmp}')+'\sqlcmd.exe';
pathFx1:=ExpandConstant('{src}')+'\testfolder\teste.sql';
pathFx2:=ExpandConstant('{src}')+'\testfolder\idontimedb.des';
Exec(connExe,' -S DEV3\IDONICSYS4 -U sa -P idsysadmin -i \""'+connFx1+'\""', '', SW_HIDE, ewWaitUntilTerminated, ResultCode)
MsgBox(IntToStr(ResultCode), mbError, mb_Ok);
Exec(connExe,' -S DEV3\IDONICSYS4 -d MSSQLTIPS -U sa -P idsysadmin -i \""'+connFx2+'\""', '', SW_HIDE, ewWaitUntilTerminated, ResultCode)
MsgBox(IntToStr(ResultCode), mbError, mb_Ok);

当我运行两个消息框时显示代码 2,但我仍然无法找到此代码的含义。 我认为我的问题在于反斜杠和引号位置,但我已经尝试了不同的组合,但它不起作用.. 感谢您的帮助。

文件的完整路径是: C:\Users\hsilva\Documents\Inno setupo scripts\Setup\Output\testfolder\teste.sql\create database

C:\Users\hsilva\Documents\Inno setupo scripts\Setup\Output\testfolder\idontimedb.des \create tables

C:\Users\hsilva\Documents\Inno setupo scripts\Setup\Output\setup.exe \executable

提前谢谢...

更新 - 2014 年 10 月 27 日 因此,正如用户 LTama 所建议的那样(再次感谢 TLama),我已经检查了运行脚本所需的文件.. 并且对所需的文件进行了评论,我做了一些更改,现在它给了我代码 1。这是什么意思? 我使用本网站http://0x3f.org/blog/howto-execute-sql-scripts-in-inno-setup/ 中的代码并进行了一些更改。

in the files section i have got this:
Source: "C:\Users\hsilva\Documents\InnoSetup\sqlcmd.exe";  Flags: dontcopy ; 
Source: "C:\Users\hsilva\Documents\InnoSetup\sqlcmd.rll";  Flags: dontcopy  ; 

我需要这两个文件吗,因为在安装 sql server 2008 r2 时,这些文件已安装,并且可用?

在代码部分我得到了这个:

procedure DeinitializeSetup();
var
connExe:String;
connFx1:String;
begin
 ExtractTemporaryFile('sqlcmd.exe');
 ExtractTemporaryFile('sqlcmd.rll');
 connExe:=ExpandConstant('{tmp}')+'\sqlcmd.exe';
 connFx1:=ExpandConstant('{src}')+'\folder\teste.sql';
 Exec(connExe,' -S DEV3\IDONICSYS4 -U sa -P idsysadmin -i \""'+connFx1+'\""', '', SW_HIDE, ewWaitUntilTerminated, ResultCode)
 MsgBox(IntToStr(ResultCode), mbError, mb_Ok);
end;
end;

这是在设置结束时执行的,我省略了一些检查,例如检查实例是否存在..

【问题讨论】:

  • 退出代码 2 代表ERROR_FILE_NOT_FOUND。你是把 sqlcmd.exe 解压到{tmp} 文件夹吗?
  • 所以在测试期间我注释了一些行并且注释了 sqlcmd.exe 和 sqlcmd.rll 行。我已经更新了帖子。
  • 我不认为这些文件是可再分发的。您应该使用现有 SQL Server 安装中的那些,或者随 SQL Server 分发一起安装的那些。所以我认为您的任务是找到现有 sqlcmd.exe 工具的路径。
  • 它现在正在工作,所以我不需要反斜杠,我只需要在文件路径之前和之后添加引号..我目前正在更改脚本以获取这两个文件 sqlcmd.exe和程序文件夹中的 sqlcmd.rll..
  • 如果用户选择将 SQL Server 安装到different location 怎么办?

标签: inno-setup sqlcmd


【解决方案1】:

这是我的想法.. 1. 该命令是否在 Inno Setup Script 之外工作?

  1. 使用LOG(); 在命令窗口中测试传递给 exe 的字符串。

  2. 将teste.sql解压到{tmp}

来源:“C:\Users\hsilva\Documents\InnoSetup\teste.sql”;标志:不要复制;

    function CustomForm_NextButtonClick(Page: TWizardPage): Boolean;


 var
    connExe:String;
    connFx1:String;
    connTxt:String;
    ResultCode: Integer;

    begin
    // need to sql server in dropdown list 
    //  sqlcmd -L > text.txt
        ExtractTemporaryFile('sqlcmd.rll');
        ExtractTemporaryFile('sqlcmd.exe');
        connExe:=ExpandConstant('{tmp}')+'\sqlcmd.exe';
        connTxt := ' -S ' + lstSqlServer.text + ' -U '+ txtUsername.Text + ' -P ' + txtPassword.Text + ' -Q "CREATE DATABASE ' + txtDatabase.Text + '"' + ' -o ' + 
    // use log to view and test the string in a command window
       Log('The Value is connTxt: ' + connTxt );
        if Exec(connExe, connTxt, '' , SW_HIDE, ewWaitUntilTerminated, ResultCode)     then
    begin
      //MsgBox(IntToStr(ResultCode), mbError, mb_Ok);
      ExtractTemporaryFile('onestep2012.sql');
      connFx1:=ExpandConstant('{tmp}\OneStep2012.sql');
      connTxt := ' -S ' + lstSqlServer.text + ' -U '+ txtUsername.Text + ' -P ' + txtPassword.Text + ' -d ' + txtDatabase.Text + ' -i ' + connFx1 + ' -o ' + ExpandConstant('{tmp}\log.log');
      Log('The Value is connTxt: ' + connTxt );
      if Exec(connExe, connTxt, '' , SW_HIDE, ewWaitUntilTerminated, ResultCode) then
      begin
      MsgBox( 'The '+ txtDatabase.Text + ' OneStep Database is ready for use' , mbInformation, mb_Ok);
      result := True;
      end;
     end;
    end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2016-01-13
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多