inno setup exec sqlcmd命令带有空格的文件路径问题

时间:2014-10-27 10:58:01

标签: inno-setup sqlcmd

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

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

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;

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

1 个答案:

答案 0 :(得分:0)

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

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

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

  3. 来源:" C:\ Users \ hsilva \ Documents \ InnoSetup \ teste.sql&#34 ;;标志:dontcopy;

        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;