【问题标题】:Nant, SqlCmd -v switch and spaces in nant property fails build with invalid argumentNant、SqlCmd -v 开关和 nant 属性中的空格无法使用无效参数构建
【发布时间】:2009-11-09 15:06:21
【问题描述】:

我有一个 nant 脚本... 1.获取光盘文件的内容 2. 将该内容分配给一个 nant 属性 3. 然后使用-v 调用sqlcmd,传入包含光盘文件内容的属性 4. 在 sql 脚本中,文件的内容应该被存储过程使用。

问题在于,当文件内容包含空格时,nant 构建会因“无效参数”问题而停止

有人知道解决这个问题的方法吗?

nant 脚本的顶部是 ...

<?xml version="1.0"?>
<!-- the main name of this project -->
<project name="Hops" default="all">
  <!-- BuildHistory -->
  <property name="buildHistoryContents" value="" />
  <xmlpeek xpath="/" file="BuildNotes.xml" property="buildHistoryContents"></xmlpeek>
  <!-- <echo message="${buildHistoryContents}" /> -->

  <!-- ***************** -->
  <target name="ExecSql">
    <echo message="running sql script : ${SqlBuildScriptsDir}${sqlBuildFileName}" />
    <exec program="${SqlCmd}" commandline="-S ${SqlServerInstanceName} -E -d HBus -i ${SqlBuildScriptsDir}${sqlBuildFileName} -v vSchemaVersion=${buildHistoryContents}  " />
  </target>

sql 脚本包含以下行...

exec lsp_SchemaVersionUpsert '1.4', N'$(vSchemaVersion)'

有效的光盘文件内容是...

<BuildNotes>
  <Note>
    <buildVer>HasNotSpace</buildVer>
  </Note>
</BuildNotes>

一个不工作的光盘文件内容是...

<BuildNotes>
  <Note>
    <buildVer>Has Space</buildVer>
  </Note>
</BuildNotes>

所有这些的用途是将 xml 构建 cmets 传递给 db 模式的表记录版本构建历史记录。

有没有人知道另一种方法或知道通过这种方法的方法?

下一部分,在 Phillip Keeley 正确解决第一部分后添加(空间问题) 我简化了原始任务以简化问题。

还有一个引用属性问题; xml 引用的属性导致 nant 构建失败并显示“无效参数”。

例如,这将导致 nant 阻塞,但删除 dt 属性将使 nant 构建成功...

<BuildNotes>
  <Note>
    <buildVer>1.4</buildVer>
    <dateStarted>09/24/2009 11:25:42</dateStarted>
    <Item dt="20091008" >SpacesAndNoQuotedAttribute</Item>
  </Note>
</BuildNotes>

有什么想法...?

【问题讨论】:

    标签: nant arguments sqlcmd


    【解决方案1】:

    你的问题是(当然)在行

    <exec program="${SqlCmd}" commandline="-S ${SqlServerInstanceName} -E -d HBus -i ${SqlBuildScriptsDir}${sqlBuildFileName} -v vSchemaVersion=${buildHistoryContents}  " />
    

    具体来说,在

    -v vSchemaVersion=${buildHistoryContents}
    

    NAnt 表达式将属性 ${buildHistoryContents} 替换为存储的值——这将包括任何嵌入的空格。问题是,当从命令窗口调用 SQLCMD(我假设这是 ${SqlCmd} 解析的内容)时,任何和所有 -v 参数的值都是空格分隔的——也就是说,解析器命中 -v,读取下一个字符通过“=”作为变量名,然后读取 = 之后的所有字符,并通过下一个空格(或行尾)作为分配给变量的值,嵌入的空格会让你大吃一惊。

    在命令行中,解决方法是将变量值用引号括起来:

     - v MyVariable=Hello World
    

    变成

     - v MyVariable="Hello World"
    

    这在这里不起作用,因为它是 XML 并且您必须用引号将 exec 元素的 commandline 属性包装起来......并且嵌入的引号将,一次再一次,把你搞砸了。

    我相信这里的解决方法是对那些嵌入的引号使用 XML 宏替换(我很可能把这些概念的正式标题弄错了)。这个值应该是

    &quot;
    

    这意味着以下应该起作用:

    <exec program="${SqlCmd}" commandline="-S ${SqlServerInstanceName} -E -d HBus -i ${SqlBuildScriptsDir}${sqlBuildFileName} -v vSchemaVersion=&quot;${buildHistoryContents}&quot;  " />
    

    请试试这个看看 -- 不久之后我可能不得不自己做这样的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 2018-09-11
      • 1970-01-01
      相关资源
      最近更新 更多